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);
}
});
}

时间: 2024-11-09 03:02:32

nodejs 导出excel的相关文章

分针网——每日分享:nodejs导出excel实战

本文转载:http://www.f-z.cn/id/268 我们都知道nodejs的内存由于v8内存分配机制的原因十分有限 64位系统也只能占1.4G左右, 因此当我们要生成或者读取大文件的时候内存的吃紧会给我们造成极大的困扰, 遇到这样的情况Node给了我们一个很好的解决方法 stream 简单的了解一下流 流是数据的集合 -- 就像数组或字符串一样.区别在于流中的数据可能不会立刻就全部可用,并且你无需一次性地把这些数据全部放入内存.这使得流在操作大量数据或是数据从外部来源逐段发送过来的时候变

nodejs+express使用ejsexcel做复杂导出Excel

注意:使用时需要了解模板接受的数据格式,并不是直接搞上去就可以了,凡是不是要有个吻合度吗. 从数据库中取出数据 大致处理后的数据格式为: 这些都准备好了你还得需要样东西,模板:<%forRBegin rs,i in data[0]%>:开始循环:因为数据封装为[[{},{},{},{}.....]]:所以通过data[0],即可取出所有数据,数组中套用数组;<%forREnd%>:结束循环:<%=rs.issue_name%>:通过你封装的key来取值: 现在是代码部分

nodejs导出word

nodejs导出word这个让人很苦恼,也是研究了半天,不过在同事的一起奋斗下和百度这个强大的工具下还是勉强完成了.这里使用的是officegen这个插件,这个插件还是很厉害的,可以导出excel.PPT,word: 首先引入officegen:var officegen = require('officegen');//之后是代码中使用了:router.get('/exportWord', function (req, res) {try {var docx = officegen('docx

通用导出excel(可控制内容)

实体类 package util; import java.sql.Timestamp; public class Book { private int bookId; private String name; private String author; private float price; private String isbn; private String pubName; private Timestamp date; public Book() { } public Book(i

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

利用poi导出Excel

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Date;import java.util.ArrayList;import java.util.List; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.

goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel.之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,看了下发现可以导出csv文件,大家都知道csv文件其实就是文本格式的excel文件,可以直接通过excel打开或是导入excel. 看起来挺好的,问题如愿解决,但是事实证明对已一个还不成熟的语言或是库最好还是先测一下的好.兴冲冲的卸了测试例子,成功导出了一个text.csv文件,一

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

导出excel 0kb的问题

运行导出代码,浏览器提示下载框,但是大小为0kb,跟踪代码执行情况,在这一行就结束了wb = new XSSFWorkbook( is );没有异常抛出.(可能是tomcat层面把异常处理了) 总之,找了半天问题,终于发现了,原来是jar包版本不一致造成的.看poi-ooxml-3.8的pom: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId>