node文件导出excel

我们做后台系统的常常会遇到文件导出,其实简单的来讲就是前端传入了对应的参数(时间范围),我们去数据库里查拿到数据,然后导出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));    
         });
     });
 }

自己也是为了学习,想分享给大家 ,同时也是让自己再一次加深印象。谢谢大家!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_42292748/article/details/83824289