本文实例讲述了nodejs导出excel的方法。分享给大家供大家参考。具体如下:
nodejs 对查询数据生成excel并下载,采用方式先生成本excel文件,然后再下载;通过比较采用excel-export插件代码如下:
excel.js代码:
生成excel文件
* @param params
*/
excel.prototype.createExcel=function(params){
var setting={savePath:"uploadFile/excel/"};
setting=extend({},setting,params);
var uuid=guid.create();
var data=params.data||"";
var result = excelExport.execute(data);
var name='excel'+uuid+'.xlsx';
var filePath= path.resolve(setting.savePath,name);
fs.writeFile(filePath,result,'binary',function(err){
setting.cb(filePath);
});
}
/**
* 计算上次的断点信息
* @param range
* @returns {number}
* @private
*/
excel.prototype._calStartPosition = function(range) {
var startPos = 0;
if( typeof range != 'undefined') {
var startPosMatch = /^bytes=([0-9]+)-$/.exec(range);
startPos = Number(startPosMatch[1]);
}
return startPos;
}
excel.prototype._configHeader = function(config) {
var startPos = 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,'Partial Content',{
'Content-Type' : 'application/octet-stream'
});
}
excel.prototype._init = function(filePath,down) {
var config = {};
var self = this;
fs.stat(filePath,function(error,state) {
if(error)
throw error;
config.fileSize = state.size;
var range = self.req.headers.range;
config.startPos = self._calStartPosition(range);
self.config = config;
self._configHeader(config);
down();
});
}
/**
* 下载文件
* @param filePath 文件路径
* @param req
* @param res
* @param isDeleted 下载完成后是否删除文件,true删除
*/
excel.prototype.download = function(filePath,req,res,isDeleted) {
var self = this;
self.req=req;
self.resp = res;
path.exists(filePath,function(exist) {
if(exist) {
self._init(filePath,function() {
var config = 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=new excel();
调用方式: