nodejs导出excel的方法

前端技术 2023/09/01 JavaScript

本文实例讲述了nodejs导出excel的方法。分享给大家供大家参考。具体如下:

nodejs 对查询数据生成excel并下载,采用方式先生成本excel文件,然后再下载;通过比较采用excel-export插件代码如下:

excel.js代码:

var extend = require(\"extend\");
var fs = require(\"fs\");
var excelExport = require(\'excel-export\');
var guid=require(\'guid\');
var path=require(\'path\');
var excel=function(){
this.req=null;
this.resp=null;
};
/**
* 生成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();

调用方式:

var excel=require(\'../lib/excelHelper.js\');
exports.exportExcel=function(req,res){
var conf ={};
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]
];
var filename =\"导出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程序设计有所帮助。

本文地址:https://www.stayed.cn/item/1284

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。