[英]How to export HTML tables to a single Excel workbook with different sheets?
I have the following code which I call on a button click and which helps me pass an html table id and have it downloaded in a single Excel workbook.我有以下代码,我在单击按钮时调用它,它可以帮助我传递一个 html 表 ID 并将其下载到单个 Excel 工作簿中。 This works fine, but I want to pass multiple table ids to get the data of different tables in different sheets of the same Excel workbook.
这工作正常,但我想传递多个表 id 以获取同一 Excel 工作簿的不同工作表中不同表的数据。 I am unable to modify this function to address that issue.
我无法修改此功能来解决该问题。
Moreover, I want to retain similar kind of formatting and use the customized file name as I have used here.此外,我想保留类似的格式并使用我在这里使用的自定义文件名。 Can anyone help me?
谁能帮我? Please find my code below:
请在下面找到我的代码:
<script>
function fnExcelReport()
{
var tab_text="<table border='2px'><tr bgcolor='#87AFC6'>";
var textRange; var j=0;
tab = document.getElementById('data'); // id of table : I want to pass more than one ids here
for(j = 0 ; j < tab.rows.length ; j++)
{
tab_text=tab_text+tab.rows[j].innerHTML+"</tr>";
//tab_text=tab_text+"</tr>";
}
tab_text=tab_text+"</table>";
var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");
if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) // If Internet Explorer
{
txtArea1.document.open("txt/html","replace");
txtArea1.document.write(tab_text);
txtArea1.document.close();
txtArea1.focus();
var e = document.getElementById("configselect");
var strUser = e.options[e.selectedIndex].text;
var f = document.getElementById("configmonth");
var strUser1 = f.options[e.selectedIndex].text;
var filename = strUser+"_"+strUser1+"_"+document.getElementById('configkpi').value+"_"+document.getElementById('configyear').value+".xls";
//alert(filename);
sa=txtArea1.document.execCommand("SaveAs",true,filename);
}
// else //other browser not tested on IE 11
// sa = window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));
// return (sa);
else {//other browser
var a = document.createElement('a');
var data_type = 'data:application/vnd.ms-excel';
var table_div = tab_text; //Your tab_text
var table_html = table_div.replace(/ /g, '%20');
//alert(table_html)
a.href = data_type + ', ' + table_html;
//setting the file name
var e = document.getElementById("configselect");
var strUser = e.options[e.selectedIndex].text;
var f = document.getElementById("configmonth");
var strUser1 = f.options[e.selectedIndex].text;
var filename = strUser+"_"+strUser1+"_"+document.getElementById('configkpi').value+"_"+document.getElementById('configyear').value+".xls";
a.download = filename;
//triggering the function
a.click();
}
return (sa);
}
You can create an Excel workbook with multiple sheets and with formatting (including colspan and rowspan) using SheetJS<\/a> .<\/i>您可以使用
SheetJS<\/a>创建具有多个工作表和格式(包括 colspan 和 rowspan)的 Excel 工作簿。<\/b> Here is a discussion thread and examples posted in that thread:<\/i>这是一个讨论线程和该线程中发布的示例:<\/b><\/p>
1) Workbook with Multiple Sheets<\/strong><\/i> 1) 多张工作簿<\/strong><\/b><\/p>
Excel<\/code> link):
https:\/\/jsfiddle.net\/97ajn9wm\/1\/<\/a> (by reviewher<\/a> )<\/i>演示(单击Excel<\/code>链接):
![](/img/trans.png)
https<\/a> :\/\/jsfiddle.net\/97ajn9wm\/1\/(由reviewher 提供<\/a>)<\/b><\/li><\/ul> I've moved reviewher<\/a> 's example code from JSFiddle to Stack Overflow for easier viewing.<\/i>我已将
reviewher<\/a>的示例代码从 JSFiddle 移至 Stack Overflow,以便于查看。<\/b> Run the code snippet and then click the resulting Excel link to download an Excel file with two sheets.<\/i>运行代码片段,然后单击生成的 Excel 链接以下载包含两个工作表的 Excel 文件。<\/b> <\/p>
function prepareTable(i) { var str = "", header = "", graphImg; header = '<html><h2 style="text-align:center;">Google' + i + '<\/h2>'; str = '<table border="1">' +'<tr><td style="text-align:center" colspan="6">Yahoo' + i + '<\/td><\/tr>' +'<tr><td style="font-weight:bold" colspan="6">(2017.03.20)<\/td><\/tr>' +'<thead>' +' <tr style="background-color:#788496; color: #ffffff">' +' <th scope="col" rowspan="2">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th scope="col">' +' <div class="tar">Yahoo(2017-01)<\/div>' +' <\/th>' +' <th scope="col" colspan="2">' +' <div class="tar">Yahoo(2016-12)<\/div>' +' <\/th>' +' <th scope="col" colspan="2">' +' <div class="tar">Yahoo(2016-12)<\/div>' +' <\/th>' +' <\/tr>' +' <tr style="background-color:#788496; color: #ffffff">' +' <th height="40" align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <\/tr>' +'<\/thead>' +' <tbody>' +' <tr style="text-align: right">' +' <td style="padding:0 20px 0 0">' +' <div>NAME<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210%<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210%<\/div>' +' <\/td>' +' <\/tr>' +' <\/tbody>' +'<\/table><\/html>'; return header + str; } function s2ab(s) { var buf = new ArrayBuffer(s.length); var view = new Uint8Array(buf); for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; return buf; } function doExcel1 () { var blob, wb = {SheetNames:[], Sheets:{}}; var ws1 = XLSX.read(prepareTable(1), {type:"binary"}).Sheets.Sheet1; wb.SheetNames.push("Sheet1"); wb.Sheets["Sheet1"] = ws1; var ws2 = XLSX.read(prepareTable(2), {type:"binary"}).Sheets.Sheet1; wb.SheetNames.push("Sheet2"); wb.Sheets["Sheet2"] = ws2; console.log(ws1); console.log(ws2); console.log(wb); blob = new Blob([s2ab(XLSX.write(wb, {bookType:'xlsx', type:'binary'}))], { type: "application\/octet-stream" }); saveAs(blob, "test.xlsx"); }<\/code><\/pre>
![](/img/trans.png)
<script src="https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/xlsx\/0.10.3\/xlsx.full.min.js"><\/script> <script src="https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/1.3.3\/FileSaver.min.js"><\/script> <a href="javascript:" class="btn_style1 excel" onclick="doExcel1()"><span>Excel<\/span><\/a><\/code><\/pre><\/div><\/div><\/p>
2) Worksheet with Formatting<\/strong><\/i> 2) 带格式的工作表<\/strong><\/b><\/p>
Here is another demo the same GitHub thread that shows multiple colspan, multiple rowspan, background color, font color, font size, etc. This example is from
HeroSony<\/a> on GitHub.<\/i>这是同一个 GitHub 线程的另一个演示,它显示了多个 colspan、多个 rowspan、背景颜色、字体颜色、字体大小等。这个例子来自 GitHub 上的
HeroSony<\/a> 。<\/b><\/p>
![](/img/trans.png)
Library:
![](/img/trans.png)
https:\/\/github.com\/SheetJS\/js-xlsx<\/a> (same as above)<\/i>库:
https<\/a> :\/\/github.com\/SheetJS\/js-xlsx(同上)<\/b><\/li>
![](/img/trans.png)
Discussion: https:\/\/github.com\/SheetJS\/js-xlsx\/issues\/664<\/a> (same as above)<\/i>讨论:
https<\/a> :\/\/github.com\/SheetJS\/js-xlsx\/issues\/664(同上)<\/b><\/li>
![](/img/trans.png)
Demo (Click Excel<\/code> link):
https:\/\/jsfiddle.net\/Herosony\/97ajn9wm\/<\/a> (by HeroSony<\/a> )<\/i>演示(单击Excel<\/code>链接):
![](/img/trans.png)
https<\/a> :\/\/jsfiddle.net\/Herosony\/97ajn9wm\/(由HeroSony 提供<\/a>)<\/b> <\/li><\/ul><\/p>
function prepareTable() { var str = "", header = "", graphImg; header = '\<h2 style="text-align:center;">Google<\/h2>'; str = '<table border="1">' +'<tr><td style="text-align:center" colspan="6">Yahoo<\/td><\/tr>' +'<tr><td style="font-weight:bold" colspan="6">(2017.03.20)<\/td><\/tr>' +'<thead>' +' <tr style="background-color:#788496; color: #ffffff">' +' <th scope="col" rowspan="2">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th scope="col">' +' <div class="tar">Yahoo(2017-01)<\/div>' +' <\/th>' +' <th scope="col" colspan="2">' +' <div class="tar">Yahoo(2016-12)<\/div>' +' <\/th>' +' <th scope="col" colspan="2">' +' <div class="tar">Yahoo(2016-12)<\/div>' +' <\/th>' +' <\/tr>' +' <tr style="background-color:#788496; color: #ffffff">' +' <th height="40" align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <th align="right">' +' <div>Yahoo<\/div>' +' <\/th>' +' <\/tr>' +'<\/thead>' +' <tbody>' +' <tr style="text-align: right">' +' <td style="padding:0 20px 0 0">' +' <div>NAME<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210%<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210<\/div>' +' <\/td>' +' <td style="width: 150px;">' +' <div>311,210%<\/div>' +' <\/td>' +' <\/tr>'; +' <\/tbody>' +'<\/table>'; return header + str; } function doExcel1 () { var blob, template = prepareTable(); blob = new Blob([template], { type: "application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8" }); saveAs(blob, "test.xls"); }<\/code><\/pre> <script src="https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/FileSaver.js\/1.3.3\/FileSaver.min.js"><\/script> <a href="javascript:" class="btn_style1 excel" onclick="doExcel1()"><span>Excel<\/span><\/a><\/code><\/pre><\/div><\/div><\/p>"]
As per your code you have used data:application/vnd.ms-excel
You can do something like this .根据您的代码,您使用了
data:application/vnd.ms-excel
您可以执行类似的操作。
JS Function JS函数
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);
}
})();
HTML (sample html code for demonstration) HTML (用于演示的示例 html 代码)
<table id="tbl1" class="table2excel">
<tr>
<td>Product</td>
<td>Price</td>
<td>Available</td>
<td>Count</td>
</tr>
<tr>
<td>Bred</td>
<td>1
</td>
<td>2
</td>
<td>3
</td>
</tr>
<tr>
<td>Butter</td>
<td>4
</td>
<td>5
</td>
<td>6
</td>
</tr>
</table>
<table id="tbl2" class="table2excel">
<tr>
<td>Product</td>
<td>Price</td>
<td>Available</td>
<td>Count</td>
</tr>
<tr>
<td>Bred</td>
<td>7
</td>
<td>8
</td>
<td>9
</td>
</tr>
<tr>
<td>Butter</td>
<td>14
</td>
<td>15
</td>
<td>16
</td>
</tr>
</table>
<button onclick="tablesToExcel(['tbl1','tbl2']
['ProductDay1','ProductDay2'], 'TestBook.xls', 'Excel')">Export to
Excel</button>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.