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 整合kindEditor实现图片上传
Feb 03 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 NodeJs
NodeJS加密解密及node-rsa加密解密用法详解
Oct 12 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
2014/06/23 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
2015/04/21 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
php实现微信支付之企业付款
2018/05/30 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
weui中的picker使用js进行动态绑定数据问题
2019/11/06 Javascript
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
Python面向对象之继承和组合用法实例分析
2018/08/27 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Django 解决model 反向引用中的related_name问题
2020/05/19 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
python两种注释用法的示例
2020/10/09 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
碧欧泉美国官网:Biotherm美国
2016/08/31 全球购物
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
世界上最好的精品店:Shoptiques
2018/02/05 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
一份比较全的PHP面试题
2016/07/29 面试题
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
质量承诺书怎么写
2014/05/24 职场文书
安全施工标语
2014/06/07 职场文书
青年志愿者活动方案
2014/08/17 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
七年级作文之游记
2019/12/11 职场文书
python绘制云雨图raincloud plot
2022/08/05 Python