最近有个需求将一个web页面上多个table显示的数据导入到一个excel的sheet页面上面。
发现目前给的demo都是直接将table导出到sheet上。
扒拉了一下xlsx的源码,发现也没提供类似功能。只有table_to_sheet和table_add_dom方法,两个方法如果多次指定table,都会被后一个覆盖前一个,无法达成目的。
后来想了个这种办法,利用xlsx里的方法,现将table转换成worksheet,然后利用sheet_to_json方法,将其转换成json对象。之后再讲多个json对象连接,然后用json_to_sheet转换成sheet对象,就能达成目的了。代码如下:
var xlsxParam = {
raw: true
}; //转换成excel时,使用原始的格式,这样导出的时候数字过长不会变成科学计数法
let workbook = XLSX.utils.book_new();
let ws1 = XLSX.utils.table_to_sheet(document.querySelector('#resultTable1'), xlsxParam);
let ws2 = XLSX.utils.table_to_sheet(document.querySelector('#resultTable2'), xlsxParam);
let ws3 = XLSX.utils.table_to_sheet(document.querySelector('#resultTable3'), xlsxParam);
let ws4 = XLSX.utils.table_to_sheet(document.querySelector('#resultTable4'), xlsxParam);
let a = XLSX.utils.sheet_to_json(ws1, { header: 1 })
let b = XLSX.utils.sheet_to_json(ws2, { header: 1 })
let c = XLSX.utils.sheet_to_json(ws3, { header: 1 })
let d = XLSX.utils.sheet_to_json(ws4, { header: 1 })
a = a.concat(['']).concat(b).concat(['']).concat(c).concat(['']).concat(d)
let worksheet = XLSX.utils.json_to_sheet(a, { skipHeader: true })
XLSX.utils.book_append_sheet(workbook, worksheet, '汇总统计');
let wbout = XLSX.write(workbook, {
bookType: 'xlsx',
bookSST: true,
type: 'array'
});
try {
FileSaver.saveAs(
new Blob([wbout], {
type: 'application/octet-stream;charset=utf-8"'
}), '汇总统计表.xlsx');
} catch (e) {
if (typeof console !== 'undefined') console.log(e, wbOut);
}
return wbout;