nodejs导出excel的方法
本文实例讲述了nodejs导出excel的方法。分享给大家供大家参考。具体如下:
nodejs对查询数据生成excel并下载,采用方式先生成本excel文件,然后再下载;通过比较采用excel-export插件代码如下:
excel.js代码:
varextend=require("extend"); varfs=require("fs"); varexcelExport=require('excel-export'); varguid=require('guid'); varpath=require('path'); varexcel=function(){ this.req=null; this.resp=null; }; /** *生成excel文件 *@paramparams */ excel.prototype.createExcel=function(params){ varsetting={savePath:"uploadFile/excel/"}; setting=extend({},setting,params); varuuid=guid.create(); vardata=params.data||""; varresult=excelExport.execute(data); varname='excel'+uuid+'.xlsx'; varfilePath=path.resolve(setting.savePath,name); fs.writeFile(filePath,result,'binary',function(err){ setting.cb(filePath); }); } /** *计算上次的断点信息 *@paramrange *@returns{number} *@private */ excel.prototype._calStartPosition=function(range){ varstartPos=0; if(typeofrange!='undefined'){ varstartPosMatch=/^bytes=([0-9]+)-$/.exec(range); startPos=Number(startPosMatch[1]); } returnstartPos; } excel.prototype._configHeader=function(config){ varstartPos=config.startPos, fileSize=config.fileSize, resp=this.resp; //如果startPos为0,表示文件从0开始下载的,否则则表示是断点下载的。 if(startPos==0){ resp.setHeader('Accept-Range','bytes'); }else{ resp.setHeader('Content-Range','bytes'+startPos+'-'+(fileSize-1)+'/'+fileSize); } resp.writeHead(206,'PartialContent',{ 'Content-Type':'application/octet-stream' }); } excel.prototype._init=function(filePath,down){ varconfig={}; varself=this; fs.stat(filePath,function(error,state){ if(error) throwerror; config.fileSize=state.size; varrange=self.req.headers.range; config.startPos=self._calStartPosition(range); self.config=config; self._configHeader(config); down(); }); } /** *下载文件 *@paramfilePath文件路径 *@paramreq *@paramres *@paramisDeleted下载完成后是否删除文件,true删除 */ excel.prototype.download=function(filePath,req,res,isDeleted){ varself=this; self.req=req; self.resp=res; path.exists(filePath,function(exist){ if(exist){ self._init(filePath,function(){ varconfig=self.config resp=self.resp; fReadStream=fs.createReadStream(filePath,{ encoding:'binary', bufferSize:1024*1024, start:config.startPos, end:config.fileSize }); fReadStream.on('data',function(chunk){ resp.write(chunk,'binary'); }); fReadStream.on('end',function(){ //是否删除文件 if(isDeleted){ fs.unlink(filePath,function(err,res){ }); } resp.end(); }); }); } else{ console.log('文件不存在!'); return; } }); } module.exports=newexcel();
调用方式:
varexcel=require('../lib/excelHelper.js'); exports.exportExcel=function(req,res){ varconf={}; conf.cols=[ {caption:'string',type:'string'}, {caption:'date',type:'string'}, {caption:'bool',type:'bool'}, {caption:'number',type:'number'} ]; conf.rows=[ ['pi','2015-06-29',true,3.14], ["e",'2015-06-29',false,2.7182] ]; varfilename="导出excel.xlsx"; res.setHeader('Content-Disposition','attachment;filename='+encodeURIComponent(filename)); excel.createExcel({ data:conf, savePath:"uploadFile/excel/", cb:function(path){ excel.download(path,req,res,true); } }); }
希望本文所述对大家的nodejs程序设计有所帮助。