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极简入门教程(二):定时器
Oct 25 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP简单系统数据添加以及数据删除模块源文件下载
2008/06/07 PHP
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
一步一步学习PHP(7) php 字符串相关应用
2010/03/05 PHP
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
隐性调用php程序的方法
2015/06/13 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP Cookie学习笔记
2016/08/23 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
jquery ui 1.7 ui.tabs 动态添加与关闭(按钮关闭+双击关闭)
2010/04/01 Javascript
js的逻辑运算符 ||
2010/05/31 Javascript
jQuery实现简单二级下拉菜单
2015/04/12 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
Vue面试题及Vue知识点整理
2018/10/07 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
Linux下编译安装MySQL-Python教程
2015/02/02 Python
python3.5使用tkinter制作记事本
2016/06/20 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
flask框架路由常用定义方式总结
2019/07/23 Python
python 提取文件指定列的方法示例
2019/08/07 Python
python实现tail -f 功能
2020/01/17 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
2020/04/21 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
公司薪酬管理制度
2014/01/31 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
关于长城的导游词
2015/01/30 职场文书
自荐信格式范文
2015/03/04 职场文书
网络妈妈观后感
2015/06/08 职场文书