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程序设计有所帮助。