1.对于一些业务系统,很常见的一个功能就是将数据生成excel导出,其实在nodejs
中已经很多优秀的第三方库可以实现这个功能,我这里选择的是node-xlsx
这个模块,其实它的本质也是依赖的xlsx
这个模块。
2.首先得将你需要的导出的数据组装好,并且设置好没一个列表的宽度,如:
// 后台所返回的数据
let result = data || [];
// 遍历组装数据
result.map(item => {
xlsxData.push([1, 2, 3]);
});
// 设置每一列的宽度
let option = {
'!cols': [{
wch: 30
}, {
wch: 20
}, {
wch: 20
}]
};
3.调用node-xlsx
模块的build
方法,将数据转换为字节流数据,并设置请求的响应头,下载保存,大致代码如下:
// 后台所返回的数据
let result = data || [];
// 遍历组装数据
result.map(item => {
xlsxData.push([1, 2, 3]);
});
// 设置每一列的宽度
let option = {
'!cols': [{
wch: 30
}, {
wch: 20
}, {
wch: 20
}]
};
// res为express或koa2请求的相应结果,此方法需在express或koa2框架下运行
getXlsxInfo(xlsxData, '渠道粉丝统计数据', option, res);
// 生成Excel表格并下载
function getXlsxInfo(xlsxData, name, option, res) {
const buffer = xlsx.build([{
name: 'sheet',
data: xlsxData
}], option);
res.setHeader('Content-Type', 'application/vnd.openxmlformats');
res.setHeader('Content-Disposition', 'attachment; filename=' + encodeURIComponent(name) + '.xlsx');
res.end(buffer, 'binary');
}
4.有个坑就是使用这种方式下载,必须是直接访问你所写的nodejs接口地址
才能打开下载功能,若使用ajax
或fetch
等方式返回的会是乱码的形式。其原因在于,这两种方式的请求发送的数据不一样,后端解析返回头也不一样,异步请求是不能触发下载返回头的。