nodejs导出excel的方法


Posted in NodeJs onJune 30, 2015

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

NodeJs 相关文章推荐
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
NodeJS与Mysql的交互示例代码
Aug 18 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
Sep 26 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
NodeJS学习笔记之Module的简介
Mar 24 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 #NodeJs
使用nodejs开发cli项目实例
Jun 03 #NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 #NodeJs
nodejs实现获取某宝商品分类
May 28 #NodeJs
Nodejs实现批量下载妹纸图
May 28 #NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 #NodeJs
浅谈NodeJS中require路径问题
May 07 #NodeJs
You might like
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
2014/06/27 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
JS控制表单提交的方法
2015/07/09 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
jQuery.uploadify文件上传组件实例讲解
2016/09/23 Javascript
简单理解Vue条件渲染
2016/12/03 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
微信小程序中换行空格(多个空格)写法详解
2018/07/10 Javascript
一秒学会微信小程序制作table表格
2019/02/14 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
JavaScript实现秒杀时钟倒计时
2019/09/29 Javascript
nodejs使用socket5进行代理请求的实现
2020/02/21 NodeJs
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python查看FTP是否能连接成功的方法
2015/07/30 Python
Python 爬虫多线程详解及实例代码
2016/10/08 Python
python中import学习备忘笔记
2017/01/24 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
农业大学毕业生的个人自我评价
2013/10/11 职场文书
大专毕业生自我评价分享
2013/11/10 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
党委班子剖析材料
2014/08/21 职场文书
推荐信范文大全
2015/03/27 职场文书
《刷子李》教学反思
2016/02/20 职场文书
Jedis操作Redis实现模拟验证码发送功能
2021/09/25 Redis