node檔案匯出excel
阿新 • • 發佈:2018-12-18
我們做後臺系統的常常會遇到檔案匯出,其實簡單的來講就是前端傳入了對應的引數(時間範圍),我們去資料庫裡查拿到資料,然後匯出excel表。
這裡我們要在node裡做匯出需要用到node自帶的幾個模組(這些模組可以用npm i 模組名稱 --dev安裝)
//在對應的server層引入
const XLSXWriter = require('xlsx-writestream');
const xlsx = require('node-xlsx');
const fs = require('fs');
const path = require('path');
首先我們先要了解下stream流的概念(也就是nodeJs裡對大檔案的操作),通俗的來講檔案過大我們不能一次性讀完或者寫完,所以就有了流,就像瓶子流水一樣,流出的水就是正在操作的內容,而瓶中的水沒有操作。
開始上程式碼
//檔案匯出
async DataDownload(datas) {
const tempDir = this.app.config.static.dir;
const { ctx } = this;
return new Promise((resolve,reject)=>{
//檔案匯出時的路徑
const filepath = `${tempDir}/PRIZE_${new Date().getTime()}.xlsx`;
console.log('^^^^^^filepath',filepath);
const writer = new XLSXWriter(filepath, {} /* options */);
//這裡就用到了流
const wirteStream = fs.createWriteStream(filepath);
writer.getReadStream().pipe(wirteStream);
//迴圈傳進來的物件,excel表裡需要的欄位
for(let i=0;i<datas.length;i++){
try{
writer.addRow({
'抽獎序號' : datas[i].id,
'抽獎人': datas[i].mixnick,
'專案id': datas[i].projectid,
'配置ID': datas[i].configid,
'抽獎時間': datas[i].drawtime,
'是否中獎': datas[i].orwinning,
'獎品等級': datas[i].level,
'獎品名稱': datas[i].prizename,
'獎品總數': datas[i].totalnum,
})
}catch(e){
console.log(e)
}
}
writer.finalize();
wirteStream.on('finish', function () {
// finish
console.log('############ 檔案寫完le filepath ############', filepath);
let reg = new RegExp("/acs/code");
let currpath = filepath.replace(reg,"");
console.log('############ 檔案寫完le currpath ############', currpath);
//最後把這個檔案路徑返給前端就好了。
resolve(path.resolve(currpath));
});
});
}
自己也是為了學習,想分享給大家 ,同時也是讓自己再一次加深印象。謝謝大家!!!!!!!!!!