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的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
初探nodeJS
Jan 24 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
详解Nodejs 通过 fs.createWriteStream 保存文件
Oct 10 NodeJs
详解Nodejs mongoose
Jun 10 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
详解nodejs内置模块
May 06 NodeJs
使用 Koa + TS + ESLlint 搭建node服务器的过程详解
May 30 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
php下用cookie统计用户访问网页次数的代码
2010/05/09 PHP
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
jQuery中dequeue()方法用法实例
2014/12/29 Javascript
javascript组合使用构造函数模式和原型模式实例
2015/06/04 Javascript
JQuery实现的按钮倒计时效果
2015/12/23 Javascript
Mint UI实现A-Z字母排序的城市选择列表
2018/12/28 Javascript
javascript中floor使用方法总结
2019/02/02 Javascript
layui下拉列表select实现可输入查找的方法
2019/09/28 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
2020/07/24 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
python万年历实现代码 含运行结果
2017/05/20 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
python实现共轭梯度法
2019/07/03 Python
Python中base64与xml取值结合问题
2019/12/22 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
基于python实现模拟数据结构模型
2020/06/12 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
2020/10/15 Python
python中温度单位转换的实例方法
2020/12/27 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
美国知名的百货清仓店:Neiman Marcus Last Call
2016/08/03 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
事业单位个人应聘自荐信
2013/09/21 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
写好自荐信需做到的5要点
2014/03/07 职场文书
保密工作承诺书
2014/08/29 职场文书
2014年团支书工作总结
2014/11/14 职场文书
酒店工程部主管岗位职责
2015/04/16 职场文书
Python中字符串对象语法分享
2022/02/24 Python