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入门详解(多篇文章结合)
Mar 07 NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
Nodejs进阶:如何将图片转成datauri嵌入到网页中去实例
Nov 21 NodeJs
浅谈Nodejs中的作用域问题
Dec 26 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
Nodejs之http的表单提交
Jul 07 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
Nodejs核心模块之net和http的使用详解
Apr 02 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 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检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
JavaScript 上万关键字瞬间匹配实现代码
2013/07/07 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
jquery uploadify隐藏上传进度的实现方法
2017/02/06 Javascript
解决bootstrap下拉菜单点击立即隐藏bug的方法
2017/06/13 Javascript
JavaScript编程设计模式之观察者模式(Observer Pattern)实例详解
2017/10/25 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
实例讲解v-if和v-show的区别
2019/01/31 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
OpenLayers3实现地图显示功能
2020/09/25 Javascript
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
python导入时小括号大作用
2017/01/10 Python
Python list与NumPy array 区分详解
2019/11/06 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
Python如何进行时间处理
2020/08/06 Python
python request 模块详细介绍
2020/11/10 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
大学生的四年学习自我评价
2013/12/13 职场文书
英语商务邀请函范文
2014/01/16 职场文书
公务员转正考察材料
2014/02/07 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android
利用Matlab绘制各类特殊图形的实例代码
2021/07/16 Python