node express buffer excel傳輸到前端下載

森林蘑菇_mushroom發表於2019-03-20

因為要使用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 比較好的中文參考部落格

相關文章