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模块学习之connect解析
Jul 05 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
通过Nodejs搭建网站简单实现注册登录流程
Jun 14 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
详解nodejs内置模块
May 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
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
基于jquery编写分页插件
2016/03/07 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
2016/06/17 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[38:38]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.17
2020/12/18 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
python多线程socket编程之多客户端接入
2017/09/12 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
python人民币小写转大写辅助工具
2018/06/20 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Python谱减法语音降噪实例
2019/12/18 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
详解如何修改python中字典的键和值
2020/09/29 Python
意大利顶级奢侈品电商:LUISAVIAROMA(支持中文)
2020/05/26 全球购物
什么是会话Bean
2015/05/14 面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
出纳岗位职责模板
2013/11/27 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
捐赠仪式主持词
2014/03/19 职场文书
大学生精神文明先进个人事迹材料
2014/05/02 职场文书
兴趣小组活动总结
2014/05/05 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技