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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
nodejs中转换URL字符串与查询字符串详解
Nov 26 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
nodejs 终端打印进度条实例代码
Apr 22 NodeJs
nodejs构建本地web测试服务器 如何解决访问静态资源问题
Jul 14 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodejs项目windows下开机自启动的方法
Nov 22 NodeJs
nodejs简单实现TCP服务器端和客户端的聊天功能示例
Jan 04 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs使用Sequelize框架操作数据库的实现
Oct 21 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
详解WordPress中添加友情链接的方法
2016/05/21 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
基于JavaScript实现div层跟随滚动条滑动
2016/01/12 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
微信页面弹出键盘后iframe内容变空白的解决方案
2017/09/20 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
Python语法快速入门指南
2015/10/12 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
python实现雨滴下落到地面效果
2018/06/21 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python调用graphviz绘制结构化图形网络示例
2019/11/22 Python
Python文件操作模拟用户登陆代码实例
2020/06/09 Python
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
会展中心部门工作职责
2013/11/27 职场文书
初一地理教学反思
2014/01/16 职场文书
公司总经理岗位职责
2014/03/15 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
小班教师个人总结
2015/02/05 职场文书
物流业务员岗位职责
2015/04/03 职场文书
基石观后感
2015/06/12 职场文书
PyTorch device与cuda.device用法
2022/04/03 Python