最近开发项目,要用到在线导出Excel的功能,于是乎就在网上找了很多例子,接下来就分享两个JS在线导出Excel的案例,由于项目中用到的是Table显示的数据,所以找的案例也是根据Table导出Excel。(废话不多说,直接上代码!)
案例一:
公共调用方法:
//导出Excel公共方法
var tablesToExcel = (function() {
var uri = 'data:application/vnd.ms-excel;base64,'
, tmplWorkbookXML = '<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?><Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'
+ '<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"><Author>Axel Richter</Author><Created>{created}</Created></DocumentProperties>'
+ '<Styles>'
+ '<Style ss:ID="Currency"><NumberFormat ss:Format="Currency"></NumberFormat></Style>'
+ '<Style ss:ID="Date"><NumberFormat ss:Format="Medium Date"></NumberFormat></Style>'
+ '</Styles>'
+ '{worksheets}</Workbook>'
, tmplWorksheetXML = '<Worksheet ss:Name="{nameWS}"><Table>{rows}</Table></Worksheet>'
, tmplCellXML = '<Cell{attributeStyleID}{attributeFormula}><Data ss:Type="{nameType}">{data}</Data></Cell>'
, 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(tables, wsnames, wbname, appname) {
var ctx = "";
var workbookXML = "";
var worksheetsXML = "";
var rowsXML = "";
for (var i = 0; i < tables.length; i++) {
if (!tables[i].nodeType) tables[i] = document.getElementById(tables[i]);
// 控制要导出的行数
for (var j = 0; j < tables[i].rows.length; j++) {
rowsXML += '<Row>';
// 控制导出的列数
for (var k = 0; k < tables[i].rows[j].cells.length; k++) {
var dataType = tables[i].rows[j].cells[k].getAttribute("data-type");
var dataStyle = tables[i].rows[j].cells[k].getAttribute("data-style");
var dataValue = tables[i].rows[j].cells[k].getAttribute("data-value");
dataValue = (dataValue)?dataValue:tables[i].rows[j].cells[k].innerHTML;
var dataFormula = tables[i].rows[j].cells[k].getAttribute("data-formula");
dataFormula = (dataFormula)?dataFormula:(appname=='Calc' && dataType=='DateTime')?dataValue:null;
ctx = { attributeStyleID: (dataStyle=='Currency' || dataStyle=='Date')?' ss:StyleID="'+dataStyle+'"':''
, nameType: (dataType=='Number' || dataType=='DateTime' || dataType=='Boolean' || dataType=='Error')?dataType:'String'
, data: (dataFormula)?'':dataValue
, attributeFormula: (dataFormula)?' ss:Formula="'+dataFormula+'"':''
};
rowsXML += format(tmplCellXML, ctx);
}
rowsXML += '</Row>';
}
ctx = {rows: rowsXML, nameWS: wsnames[i] || 'Sheet' + i};
worksheetsXML += format(tmplWorksheetXML, ctx);
rowsXML = "";
}
ctx = {created: (new Date()).getTime(), worksheets: worksheetsXML};
workbookXML = format(tmplWorkbookXML, ctx);
// 查看后台的打印输出
//console.log(workbookXML);
var link = document.createElement("A");
link.href = uri + base64(workbookXML);
link.download = wbname || 'Workbook.xls';
link.target = '_blank';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
})();
调用:可以写个button案例时间去触发他,我的是这样的
第一个参数是Table的id,如果没有要绑定一个
第二个参数默认这样,改成其他也可以,我直接复制的网上的,没有修改
第三个参数是导出的Excel名称,可以修改你想要的
第四个参数是Excel类型
//导出Excel按钮
function BtnToExcel_onclick(){
//第一个参数是Table的id,如果没有要绑定一个
//第二个参数默认这样,改成其他也可以,我直接复制的网上的,没有修改
//第三个参数是导出的Excel名称,可以修改你想要的
//第四个参数是Excel类型
tablesToExcel(['TableID'], ['ProductDay1'], 'Demo.xls', 'Excel');
}
总结:一开始找的是这个,引用可以导出Excel成功,之后测试中,发现导出的数据在微软Office中Excel打开是有数据的,但是呢,WPS中的Excel打开是没有数据的。然后在网上找到原因,无解。这不得不使我在从网上找其他的例子。欢迎广大大神解决指教!
案例二:
公共调用方法:
var tableToExcel = (function() {
var uri = 'data:application/vnd.ms-excel;base64,',
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><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <!--[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>{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, filename) {
if (!table.nodeType) table = document.getElementById(table);
console.log(table.innerHTML);
var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML };//此时的innerHTML数据可以自己自定义 比如json转化 只要值要数据符合即可
var link = document.createElement("A");
link.href = uri + base64(format(template, ctx));
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
});
调用:可以写个button案例时间去触发他,我的是这样的
第一个参数是Table的id,如果没有要绑定一个
第二个参数默认这样,不用修改
第三个参数是导出的Excel名称,可以修改你想要的
//导出Excel按钮
function toExcel_onclick(){
var download = tableToExcel();
//第一个参数是Table的id,如果没有要绑定一个
//第二个参数默认这样,不用修改
//第三个参数是导出的Excel名称,可以修改你想要的
download("TableID", 'sheet', "Demo.xls");
}
总结:由于找到的第一个不能兼容Office和WPS,这个亲测可以兼容使用,同样的欢迎大家亲测,用类似更好的也希望大神分享!
以上代码来源网上,根据项目需求做相应修改后而得!很长没有更新博客啦!
记录,总结,分享!学习永远在路上!