jsp导出Excel文件
这种博客网上有很多了,但是有些由于浏览器版本问题,还有数据文本问题零碎的东西
结合我遇到的问题,在这里记录一下我自己的小笔记,欢迎大家来践踏,哈哈哈。
话不多说,直接上代码
以下是jsp
<table id="predetermineTable" class="table table-hover my-table table-bordered" style="width: 100%">
<thead>
<tr>
<th>标题</th>
<th>姓名</th>
<th>身份证号</th>
<th>单位</th>
<th>活动开始时间</th>
<th>活动结束时间</th>
<th>报名时间</th>
<th>状态</th>
</tr>
</thead>
<tbody>
<c:forEach items="${dataList}" var="item" varStatus="status">
<tr id="dataRow_${item.announcementId}" class="dataRow" >
<td>${item.announcementTitle}</td>
<td>${item.realName}</td>
<td style="mso-number-format:'\@';">${item.idCard}</td>
<td>${item.unitsName}</td>
<td>
<fmt:formatDate value="${item.showStart}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<fmt:formatDate value="${item.showEnd}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<fmt:formatDate value="${item.createTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
</td>
<td>
<c:if test="${item.predetermineStatus ==1}">有效</c:if>
<c:if test="${item.predetermineStatus ==0}">无效</c:if>
</td>
</tr>
</c:forEach>
</tbody>
</table>
以上是table部分要注意的是如下,是解决一串数字比如身份证号,银行账号等导出后变科学计数法的问题(这块主要针对IE吧,其它浏览器可以在table标签里直接设置style属性,下面有)
<td style="mso-number-format:'\@';">${item.idCard}</td>
以下是js
var idTmr;
function getExplorer() {
var explorer = window.navigator.userAgent;
// ie 判断IE浏览器的方式大都用这个,但是也有不好使的时候
if (explorer.indexOf("MSIE") >= 0) {
return 'ie';
}
//上边不好使就用这个方法判断是不是IE,因为只有IE才有ActiveX控件
if (!!window.ActiveXObject || "ActiveXObject" in window) {
return 'ie';
}
// firefox
else if (explorer.indexOf("Firefox") >= 0) {
return 'Firefox';
}
// Chrome
else if (explorer.indexOf("Chrome") >= 0) {
return 'Chrome';
}
// Opera
else if (explorer.indexOf("Opera") >= 0) {
return 'Opera';
}
// Safari
else if (explorer.indexOf("Safari") >= 0) {
return 'Safari';
}
}
function exportToExcel(tableid) {// 整个表格拷贝到EXCEL中
if (getExplorer() == 'ie') {
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
// 创建AX对象excel
var oWB = oXL.Workbooks.Add();
// 获取workbook对象
var xlsheet = oWB.Worksheets(1);
// 激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
// 把表格中的内容移到TextRange中
sel.select;
// 全选TextRange中内容
sel.execCommand("Copy");
// 复制TextRange中内容
xlsheet.Paste();
// 粘贴到活动的EXCEL中
oXL.Visible = true;
// 设置excel可见属性
try {
table = document.getElementById(table)
// 这是作者用于命名Excel文件的方法,你有更好的方法那更好
var table = document.getElementById("predetermineTable");
var v0 = table.rows[1].cells[0].innerHTML;
var filename = v0 + "预约报名表";
var fname = oXL.Application.GetSaveAsFilename(filename+".xls",
"Excel Spreadsheets (*.xls), *.xls");
} catch (e) {
print("Nested catch caught " + e);
} finally {
oWB.SaveAs(fname);
oWB.Close(savechanges = false);
// xls.visible = false;
oXL.Quit();
oXL = null;
// 结束excel进程,退出完成
// window.setInterval("Cleanup();",1);
idTmr = window.setInterval("Cleanup();", 1);
}
} else {
tableToExcel(tableid)
}
}
function Cleanup() {
window.clearInterval(idTmr);
CollectGarbage();
}
var tableToExcel = (function() {
var uri = 'data:application/vnd.ms-excel;base64,',
//准备好要生成Excel的模板
template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" '
+ 'xmlns:x="urn:schemas-microsoft-com:office:excel" '
+ 'xmlns="http://www.w3.org/TR/REC-html40">'
+ '<head>'
+ '<!--[if gte mso 9]>'
+ '<xml>'
+ '<x:ExcelWorkbook>'
+ '<x:ExcelWorksheets>'
+ '<x:ExcelWorksheet>'
+ '<x:Name>{worksheet}</x:Name>'
+ '<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions>'
+ '</x:ExcelWorksheet>'
+ '</x:ExcelWorksheets>'
+ '</x:ExcelWorkbook>'
+ '</xml>'
+ '<![endif]-->'
+ '</head>'
+ '<body ><table style="vnd.ms-excel.numberformat:@">{table}</table></body>'
+ '</html>',
base64 = function(s) {
return window.btoa(unescape(encodeURIComponent(s)))
}, format = function(s, c) {
return s.replace(/{(\w+)}/g, function(m, p) {
return c[p];
})
}
return function(table, name) {
if (!table.nodeType)
table = document.getElementById(table)
// 获得主题名 命名文件名和excel标题
var table = document.getElementById("predetermineTable");
var v0 = table.rows[1].cells[0].innerHTML;
var name = v0 + "预约报名表";
//组好要导出的数据源
var ctx = {
worksheet : name || "Worksheet",
//这里是作者主动加的excel标题(合并并居中)
table : table.innerHTML.replace("<thead>","<thead><tr><th colspan='8'>"+name+"</th></tr>")
}
//format(template, ctx)这个方法就是类似于freemark一样,往模板里填数据
//不需要改名字就如下直接输出
//window.location.href = uri + base64(format(template, ctx));
//需要改文件名字就如下
var link = uri + base64(format(template, ctx));
var a = document.createElement("a");
a.download = name+".xls";
a.href = link;
a.click();
//如果上面方法不行的话就用下面的方法
//document.getElementById("predetermineExcelButton").href = uri + base64(format(template, ctx));
//document.getElementById("predetermineExcelButton").download = "fhaio.xls";
//document.getElementById("predetermineExcelButton").click();
}
})()
有错的地方欢迎指正,谢谢 。
ps :第一次写博客,有不好的地方多多包涵~~~