使用javascript将工作表添加到excel文件

假设我有3张桌子。 我想插入3张工作表(每页一张表)到一个单一的Excel文件(不需要ActiveXObject)

在这里输入图像说明

我试过下面的代码,但是它只创build一个工作表

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><!--[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><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) { if (!table.nodeType) table = document.getElementById(table) var ctx = { worksheet: name || 'Worksheet', table: table.innerHTML } window.location.href = uri + base64(format(template, ctx)) } })(); 

您显示的方法使用电子表格XML和HTML的混合。 用这种混合物不可能填充多个工作表。 为此,我们必须仅使用Spreadsheet XML。 这是因为只有XML可以描述多个工作表。 HTML表格数据与除活动工作表之外的任何工作表无关。

仅使用Spreadsheet XML是可能的,但是我们必须仔细处理数据types。 如果Excel导入HTML,则会尝试检测数据types,就像用户手动将值input单元格一样。 用XML不是这样的。 它从XML获取给定的数据types。 如果它们不合适,则会产生错误。 所以在我的例子中,我使用“数据”属性来描述数据types,数据样式和数据值。 所以在HTML表格单元(TD)中可能有不同于数据表示的数据值。 由于HTML是一种数据显示格式,而不是数据交换,所以在我看来这也是一个很好的做法。

有关电子表格XML,请参阅: http : //msdn.microsoft.com/zh-cn/library/aa140066.aspx

该示例使用数据URI作为下载链接,因此它只能在支持此function的浏览器上使用。 它不适用于Microsoft Internet Explorer。

例:

 <script type="text/javascript"> 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); } })(); </script> <table id="tbl1"> <tr> <td>Name</td> <td>Birthday</td> <td>Amount</td> <td>Rebate (10%)</td> </tr> <tr> <td>Smith</td> <td data-type="DateTime" data-style="Date" data-value="1980-03-23">Mar 23 1980</td> <td data-type="Number" data-style="Currency" data-value="1234.56">$ 1,234.56</td> <td data-formula="=RC[-1]/10" data-type="Number" data-style="Currency">$ 123.45</td> </tr> <tr> <td>Doe</td> <td data-type="DateTime" data-style="Date" data-value="1978-11-05">Nov 05 1978</td> <td data-type="Number" data-style="Currency" data-value="2345.67">$ 2,345.67</td> <td data-formula="=RC[-1]/10" data-type="Number" data-style="Currency">$ 234.56</td> </tr> </table> <hr> <table id="tbl2"> <tr> <td>Product</td> <td>Price</td> <td>Available</td> <td>Count</td> </tr> <tr> <td>Bred</td> <td data-type="Number" data-style="Currency" data-value="1.89">$ 1.89</td> <td data-type="Boolean" data-value="1">yes</td> <td data-type="Number" data-value="123">123</td> </tr> <tr> <td>Butter</td> <td data-type="Number" data-style="Currency" data-value=".89">$ .89</td> <td data-type="Boolean" data-value="0">no</td> <td data-type="Number" data-value="0">0</td> </tr> </table> <button onclick="tablesToExcel(['tbl1','tbl2'], ['Customers','Products'], 'TestBook.xls', 'Excel')">Export to Excel</button> <button onclick="tablesToExcel(['tbl1','tbl2'], ['Customers','Products'], 'TestBook.xls', 'Calc')">Export to Calc</button> 

小提琴: http : //jsfiddle.net/qxLn3h86/

问候

阿克塞尔