因為要使用js-xlsx獲取json轉為xlsx,傳輸給前端下載。翻了很多的文件,js-xlsx的文件真的難讀啊。
方式1
- buffer 直接通過stream 傳輸給前端。好處就是不用先存再download了
const XLSX = require('xlsx');
var stream = require('stream');
const book = XLSX.utils.book_new();
const sheet = XLSX.utils.aoa_to_sheet([
["你好", "我不好", "嘻嘻嘻"],
[1, 2, 3],
[3, 4, 5],
[8, 7, 6],
[213, 123, 123],
]);
XLSX.utils.book_append_sheet(book, sheet, "test");
const fileContents = XLSX.write(book, { type: 'buffer', bookType: 'xlsx', bookSST: false });
var readStream = new stream.PassThrough();
readStream.end(fileContents);
let fileName = "text.xlsx";
res.set('Content-disposition', 'attachment; filename=' + fileName);
res.set('Content-Type', 'text/plain');
readStream.pipe(res);
複製程式碼
方式2
// fileContents 是上面的fileContents,一樣的buffer。
let fileName = moment().format('YYYYMMDDHHmmss') + '.xlsx';
let filePath = 'doc/' + fileName;
fs.writeFileSync(filePath, fileContents, { encoding: 'binary' });
return res.download(filePath, fileName);
//也可以這麼寫。
//fs.writeFile(savedFilePath, fileContents, function() {
//response.status(200).download(savedFilePath, fileName);
//});
複製程式碼
最後,前端訪問下載推薦使用get,直接用a標籤點選下載。如果用post就要建立一個a標籤,點選一下,具體的百度谷歌吧。
參考1 stackoverflow
比較好的中文參考部落格