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 sublime text 3安装与配置
Jun 19 NodeJs
提高NodeJS中SSL服务的性能
Jul 15 NodeJs
轻松创建nodejs服务器(10):处理POST请求
Dec 18 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
nodejs实例解析(输出hello world)
Jan 03 NodeJs
NodeJS实现客户端js加密
Jan 09 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
Jul 05 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 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/03/21 PHP
实用函数8
2007/11/08 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
laravel 实现划分admin和home 模块分组
2019/10/15 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
IE iframe的onload方法分析小结
2010/01/07 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
深入理解jQuery中live与bind方法的区别
2013/12/18 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
Js+php实现异步拖拽上传文件
2015/06/23 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
JS实现的跨浏览器解析XML文件实例
2016/06/21 Javascript
node.js连接MongoDB数据库的2种方法教程
2017/05/17 Javascript
Thinkphp5微信小程序获取用户信息接口的实例详解
2017/09/26 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
微信小程序实用代码段(收藏版)
2019/12/17 Javascript
原生JS与JQ获取元素的区别详解
2020/02/13 Javascript
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
PyCharm中如何直接使用Anaconda已安装的库
2020/05/28 Python
python如何查看安装了的模块
2020/06/23 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
大学生简单自荐信
2013/11/10 职场文书
大学生的四年学习自我评价
2013/12/13 职场文书
《胡杨》教学反思
2014/02/16 职场文书
创业培训计划书
2014/05/03 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书