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 URL模块操作URL相关方法介绍
Mar 03 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
Nodejs实现多房间简易聊天室功能
Jun 20 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 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下几种删除目录的方法总结
2007/08/19 PHP
学习php开源项目的源码指南
2014/12/21 PHP
支持中文、字母、数字的PHP验证码
2015/05/04 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
php微信公众号开发之快递查询
2018/10/20 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
Jquery实时监听input value的实例
2017/01/26 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
webpack打包单页面如何引用的js
2017/06/07 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
浅谈在Vue.js中如何实现时间转换指令
2019/01/06 Javascript
python实现BackPropagation算法
2017/12/14 Python
使用pip发布Python程序的方法步骤
2018/10/11 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python各种excel写入方式的速度对比
2020/11/10 Python
如何用python 操作zookeeper
2020/12/28 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
面试后的英文感谢信
2014/02/01 职场文书
优秀团员事迹材料
2014/12/25 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
工会积极分子个人总结
2015/03/03 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
tree shaking对打包体积优化及作用
2022/07/07 Java/Android
Docker安装MySql8并远程访问的实现
2022/07/07 Servers