这篇文章主要介绍了nodejs导出excel的方法,实例分析了nodejs导出excel的详细步骤与相关技巧,需要的朋友可以参考下
本文实例讲述了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程序设计有所帮助。
新闻热点
疑难解答
图片精选