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代码片段
Feb 04 NodeJs
nodejs如何获取时间戳与时间差
Aug 03 NodeJs
Nodejs--post的公式详解
Apr 29 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
NodeJS设计模式总结【单例模式,适配器模式,装饰模式,观察者模式】
Sep 06 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs超出最大的调用栈错误问题
Dec 27 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
nodejs实现范围请求的实现代码
Oct 12 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中使用session防止用户非法登录后台的方法
2015/01/27 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
PHP实现添加购物车功能
2017/03/06 PHP
Laravel如何创建服务器提供者实例代码
2019/04/15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
Web开发必知Javascript技巧大全
2016/02/23 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
Angular指令之restict匹配模式的详解
2017/07/27 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
[02:32]DOTA2完美大师赛场馆静安体育中心观赛全攻略
2017/11/08 DOTA
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
python中PIL安装简单教程
2016/04/21 Python
Python中取整的几种方法小结
2017/01/06 Python
Python多层装饰器用法实例分析
2018/02/09 Python
有关Python的22个编程技巧
2018/08/29 Python
Django 静态文件配置过程详解
2019/07/23 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
Python图片处理模块PIL操作方法(pillow)
2020/04/07 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
python3实现简单飞机大战
2020/11/29 Python
Monnier Freres中文官网:法国领先的奢侈品配饰在线零售商
2017/11/01 全球购物
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
女孩每月服装订阅盒:kidpik
2019/04/17 全球购物
数据员岗位职责
2013/11/19 职场文书
小学教师师德反思
2014/02/03 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
公司放假通知范文
2015/04/14 职场文书