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实现PHP的print_r函数代码
Mar 14 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Nodejs中session的简单使用及通过session实现身份验证的方法
Feb 04 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodejs async异步常用函数总结(推荐)
Nov 17 NodeJs
修改Nodejs内置的npm默认配置路径方法
May 13 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
nodejs制作小爬虫功能示例
Feb 24 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
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
JavaScript高级程序设计 阅读笔记(二十) js错误处理
2012/08/14 Javascript
IE不支持getElementsByClassName最终完美解决方案
2012/12/17 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
使用javaScript动态加载Js文件和Css文件
2015/10/24 Javascript
浅析Bootstrip的select控件绑定数据的问题
2016/05/10 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
angular多语言配置详解
2019/05/16 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
token 机制和实现方式
2020/12/15 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python过滤列表用法实例分析
2016/04/29 Python
python的Tqdm模块的使用
2018/01/10 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Python中如何引入第三方模块
2020/05/27 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python识别处理照片中的条形码
2020/11/16 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
奥地利婴儿用品和玩具购物网站:baby-markt.at
2020/01/26 全球购物
组织关系转移介绍信
2014/01/16 职场文书
2014法制宣传日活动总结
2014/07/09 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书
2015年医院保卫科工作总结
2015/07/23 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
Python3.10的一些新特性原理分析
2021/09/15 Python