本文实例讲述了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.configresp = 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程序设计有所帮助。