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初级阶段之express
Nov 23 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 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
一个MYSQL操作类
2006/11/16 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
php生成动态验证码gif图片
2015/10/19 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
Javascript 表单之间的数据传递代码
2008/12/04 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
JS功能代码集锦
2016/05/04 Javascript
深入浅析JavaScript中的Function类型
2016/07/09 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
Three.JS实现三维场景
2018/12/30 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
浅析Python中的for 循环
2016/06/09 Python
简单谈谈python的反射机制
2016/06/28 Python
Python弹出输入框并获取输入值的实例
2019/06/18 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
python 动态绘制爱心的示例
2020/09/27 Python
描述内存分配方式以及它们的区别
2016/10/15 面试题
历史学专业个人的自我评价
2013/10/13 职场文书
财会自我鉴定范文
2013/12/27 职场文书
会议邀请书范文
2014/02/02 职场文书
股份合作协议书范本
2014/04/14 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
元宵节寄语大全
2015/02/27 职场文书