将数据生成Excel并导出是后台管理系统常备的功能,但是之前还没有尝试过通过NodeJs去实现,这一次在网上去搜索了具体的实现方法,从中了解到了一个node-xlsx的node模块,在npm的官网上了解了相关的使用方法。
const xlsx = require('node-xlsx');
在具体操作的时候,生成excel时需要的数据是数组值类型数组,[[1,2,3],[1,2,3],[1,2,3],[1,2,3]],应该可以看懂什么意思,这样的数据生成的是四行每行三列,数据为每行都是1,2,3的文件,在这之前需要先在数组里添加一个标题的数组,然后遍历查询的数据进行追加,可以通过options来定义列宽,但再设置其他的样式,就需要引入一个全新的库了,通过xlsx.的buide方法进行数据的转换,最后再调用fs的writeFile方法去生成文件,最后返回数据的时候只需要返回文件所在的位置即可。
//下载所有用户信息
router.get('/download',(req,res)=>{
DB.find('user',{},(err,user)=>{
if(err){
res.send({
code : 0 ,
msg : '下载失败'
});
}
const DATA = [['用户名','用户密码','年龄','性别','生日',
'头像地址','家乡','手机号','QQ']];
user.forEach((node)=>{
const Arr = [
node.UserName, node.PassWorld, node.Age,
node.Gender==='male'?'男':'女', node.Birthday, node.Picture,
node.Hometown, node.Phone, node.QQ
];
DATA.push(Arr)
});
const options = {'!cols': [{wch:11},{wch:14},{wch:8},{wch:6},{wch:13},
{wch:50},{wch:16},{wch:15},{wch:13}]};
const buffer = xlsx.build([{name: "所有用户信息表", data: DATA}],options);
fs.writeFile('./public/download/user.xlsx',buffer,(err)=>{
if(err){
res.send({
code : 0 ,
msg : '下载失败'
});
}
res.send({
code:1,
file: 'http://' + req.headers.host + '/download/user.xlsx'
})
});
})
});
在前台的处理更是简单方便,直接跳转文件地址就可以完成下载
const result = await reqUserDownload();
if(result.code === 1){
window.location.href = result.file;
}
我这次的做法比较粗糙,因为是导出的所有用户的数据,其实通过传递每页的数据量数和当前页数,就可以打印当前页的数据,或者打印指定条数的数据,仅供参考。
最后想要完整代码的,欢迎访问我的GitHub,最好来个Star,哈哈。 |