方法1:Blob+a标签
Blob是一个构造函数,创建一个Blob对象的操作为:new Blob([data],{type})
其中data为文件流,type为数据的MIME类型
MIME类型包含文本、图像、音频、视频等。
此处扩展名为.xls MIME类型为application/vnd.ms-excel,具体可见=》www.w3school.com.cn/media/media…
exportXsl(){
var html = JSON.stringify(res.data.data)//1.假设调用接口的话
//2.使用outerHTML属性获取整个table元素的HTML代码(显性表格)
var html = document.getElementsByTagName("table")[0].outerHTML;
//实例化一个Blob对象
let blob = new Blob([html],{type:"application/vnd.ms-excel"}),
link = document.createElement("a"),
//创建一个新的URL对象
href = window.URL.createObjectURL(blob);
link.href = href;
//模拟触发点击链接
document.body.appendChild(link);
link.click();
//移除
document.body.removeChild(link);
}
方法2:利用插件
给表格添加样式,这里利用xlsx-populate插件
npm install xlsx-populate
可见以下示例代码
逻辑:用xlsx-populate插件生成表格并且设置需要的样式,用xlsx将sheet添加到工作薄,然后调用方法将工作部转化成blob对象,最后使用blob+a标签方法生成链接模拟点击下载。
workbook转化成blob对象:
function workbook2blob(workbook) {
// 生成excel的配置项
var wopts = {
// 要生成的文件类型
bookType: "xlsx",
// // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
bookSST: false,
type: "binary"
};
var wbout = XLSX.write(workbook, wopts);
// 将字符串转ArrayBuffer
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;
}
var blob = new Blob([s2ab(wbout)], {
type: "application/octet-stream"
});
return blob;
}
import XlsxPopulate from 'xlsx-populate'
XlsxPopulate.fromBlankAsync().then(function(workbook){
//生成表格(包含样式和数据)
var sheet = workbook.sheet(0);
//设置A列的样式
sheet.column("A").width(35).style({
wrapText:true
});
sheet.column("B").width(18).style({
wrapText:true,
numberFormat:"0.00"//设置数字精度为小数点后两位
});
sheet.cell("A2").value("this is neat!");//A2单元格添加文本
sheet.cell("A1").value([1,2,3]).style({
leftBorder:"thick",
rightBorder:"thick",//设置左右边框
});
const r = sheet.range("B1:D3");//在B1~D3内设置
r.value(5);//全填入5
const r2 = sheet.range("A4:C6");
r2.value([
[1,2,3],
[4,5,6],
[7,8,9]
])
//样式添加完毕,返回结果
var wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, sheet, "table");
const workbookBlob = workbook2blob(wb);
var link = document.createElement("a"),
//创建一个新的URL对象
href = window.URL.createObjectURL(workbookBlob);
link.href = href;
//模拟触发点击链接
document.body.appendChild(link);
link.click();
//移除
document.body.removeChild(link);
})
})
js-xlsx用法:
npm install xlsx
import XLSX from "xlsx"
handleExport(){
//创建表1、2......
const sheetData = data.map(item =>({
//设置表头和对应项的值
'ID':item.id,
'NAME':item.name,
'TIME':item.time,
}));
const sheetData2 = ....;
const sheet = XLSX.utils.json_to_sheet(sheetData);
const sheet2 = XLSX.utils.json_to_sheet(sheetData2);
const wb = XLSX.utils.book_new();//创建workbook
//将两个表放入工作簿中生成表格
XLSX.utils.book_append_sheet(wb,sheet,'列表1')
XLSX.utils.book_append_sheet(wb,sheet2,'列表2')
//生成blob对象,见上
const workbookBlob = workbook2blob(wb)
var link = document.createElement("a"),
//创建一个新的URL对象
href = window.URL.createObjectURL(workbookBlob);
link.href = href;
//模拟触发点击链接
document.body.appendChild(link);
link.click();
//移除
document.body.removeChild(link);
}