nodejs導(dǎo)出excel的方法
本文實(shí)例講述了nodejs導(dǎo)出excel的方法。分享給大家供大家參考。具體如下:
nodejs 對(duì)查詢數(shù)據(jù)生成excel并下載,采用方式先生成本excel文件,然后再下載;通過(guò)比較采用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);
});
}
/**
* 計(jì)算上次的斷點(diǎn)信息
* @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開(kāi)始下載的,否則則表示是斷點(diǎn)下載的。
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();
調(diào)用方式:
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 ="導(dǎo)出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);
}
});
}
希望本文所述對(duì)大家的nodejs程序設(shè)計(jì)有所幫助。
- nodejs簡(jiǎn)單讀寫excel內(nèi)容的方法示例
- Node.js利用js-xlsx處理Excel文件的方法詳解
- Node.js實(shí)現(xiàn)Excel轉(zhuǎn)JSON
- Nodejs獲取網(wǎng)絡(luò)數(shù)據(jù)并生成Excel表格
- 詳解使用Node.js 將txt文件轉(zhuǎn)為Excel文件
- node.js讀取Excel數(shù)據(jù)(下載圖片)的方法示例
- nodejs使用node-xlsx生成excel的方法示例
- nodejs讀取并去重excel文件
- Node解決簡(jiǎn)單重復(fù)問(wèn)題系列之Excel內(nèi)容的獲取
- Nodejs技巧之Exceljs表格操作用法示例
- node讀寫Excel操作實(shí)例分析
相關(guān)文章
詳解nodejs操作mongodb數(shù)據(jù)庫(kù)封裝DB類
這篇文章主要介紹了詳解nodejs操作mongodb數(shù)據(jù)庫(kù)封裝DB類,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
使用 Node.js 對(duì)文本內(nèi)容分詞和關(guān)鍵詞抽取
這篇文章主要介紹了使用 Node.js 對(duì)文本內(nèi)容分詞和關(guān)鍵詞抽取,需要的朋友可以參考下2017-05-05
nodejs開(kāi)發(fā)——express路由與中間件
本篇文章主要介紹了nodejs開(kāi)發(fā)——express路由與中間件 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
Node.js Sequelize如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫分離
Sequelize是一個(gè)易于使用,支持多SQL方言(dialect)的對(duì)象-關(guān)系映射框架(ORM),這個(gè)庫(kù)完全采用JavaScript開(kāi)發(fā)并且能夠用在Node.JS環(huán)境中。它當(dāng)前支持MySQL, MariaDB, SQLite 和 PostgreSQL 數(shù)據(jù)庫(kù)。在Node.js中,使用 Sequelize操作數(shù)據(jù)庫(kù)時(shí),同樣支持讀寫分離。2016-10-10
node?gyp安裝canvas原生模塊編譯node?pregyp詳解
這篇文章主要為大家介紹了Nodejs關(guān)于原生模塊編譯node-gyp + node-pre-gyp (以安裝canvas為例)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
從Node.js事件觸發(fā)器到Vue自定義事件的深入講解
這篇文章主要給大家介紹了關(guān)于從Node.js事件觸發(fā)器到Vue自定義事件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
node.js中RPC(遠(yuǎn)程過(guò)程調(diào)用)的實(shí)現(xiàn)原理介紹
這篇文章主要介紹了node.js中RPC(遠(yuǎn)程過(guò)程調(diào)用)的實(shí)現(xiàn)原理介紹,本文基于一個(gè)簡(jiǎn)單的RPC庫(kù)nodejs light_rpc實(shí)現(xiàn),需要的朋友可以參考下2014-12-12
深入淺析Node.js 事件循環(huán)、定時(shí)器和process.nextTick()
這篇文章主要介紹了Node.js 事件循環(huán)、定時(shí)器和process.nextTick()的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10

