我们做后台系统的常常会遇到文件导出,其实简单的来讲就是前端传入了对应的参数(时间范围),我们去数据库里查拿到数据,然后导出excel表。
这里我们要在node里做导出需要用到node自带的几个模块(这些模块可以用npm i 模块名称 --dev安装)
//在对应的server层引入
const XLSXWriter = require('xlsx-writestream');
const xlsx = require('node-xlsx');
const fs = require('fs');
const path = require('path');
首先我们先要了解下stream流的概念(也就是nodeJs里对大文件的操作),通俗的来讲文件过大我们不能一次性读完或者写完,所以就有了流,就像瓶子流水一样,流出的水就是正在操作的内容,而瓶中的水没有操作。
开始上代码
//文件导出
async DataDownload(datas) {
const tempDir = this.app.config.static.dir;
const { ctx } = this;
return new Promise((resolve,reject)=>{
//文件导出时的路径
const filepath = `${tempDir}/PRIZE_${new Date().getTime()}.xlsx`;
console.log('^^^^^^filepath',filepath);
const writer = new XLSXWriter(filepath, {} /* options */);
//这里就用到了流
const wirteStream = fs.createWriteStream(filepath);
writer.getReadStream().pipe(wirteStream);
//循环传进来的对象,excel表里需要的字段
for(let i=0;i<datas.length;i++){
try{
writer.addRow({
'抽奖序号': datas[i].id,
'抽奖人': datas[i].mixnick,
'项目id': datas[i].projectid,
'配置ID': datas[i].configid,
'抽奖时间': datas[i].drawtime,
'是否中奖': datas[i].orwinning,
'奖品等级': datas[i].level,
'奖品名称': datas[i].prizename,
'奖品总数': datas[i].totalnum,
})
}catch(e){
console.log(e)
}
}
writer.finalize();
wirteStream.on('finish', function () {
// finish
console.log('############ 文件写完le filepath ############', filepath);
let reg = new RegExp("/acs/code");
let currpath = filepath.replace(reg,"");
console.log('############ 文件写完le currpath ############', currpath);
//最后把这个文件路径返给前端就好了。
resolve(path.resolve(currpath));
});
});
}
自己也是为了学习,想分享给大家 ,同时也是让自己再一次加深印象。谢谢大家!!!!!!!!!!