本文实例讲述了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
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我