如何在节点 js 中写入 xls 文件和流以响应

ASH*_*ISH 6 javascript excel xlsx node.js nodejs-stream

我尝试过的内容如下:

exports.downloadListOfUsers = (req, res) => {
    let users = [{id:'',name:'',lastName:'',gender:''},{...},{...}]
    const XLSX = require('xlsx');
    let ws = XLSX.utils.aoa_to_sheet(users); //XLSZ.utils.json_to_sheet(users)
    let wb = XLSX.utils.book_new();
    let wbout = XLSX.write(wb, {bookType: 'xlsx', type: 'binary'});
    wbout.pipe(res)
}
Run Code Online (Sandbox Code Playgroud)

将其发送到客户端后,响应状态为待处理,一段时间后失败。我不知道我错过了什么。请指导我。谢谢。

小智 11

这个想法是创建一个有效的 Excel 文件,然后流式传输它。

观察创建 Workbook 并将 JSON 数据写入其中的调用顺序。如果您想处理多个客户端请求并创建发送数据的历史记录/日志,您可能需要为不同的 Excel 文件创建唯一的名称。

这是一个完整的工作示例(请参阅内联评论):

const fs = require('fs');
const server = require('http').createServer();
const XLSX = require('xlsx');

server.on('request', (req, res) => {
    const data = [
        {id: '1', name: 'abc'},
        {id: '2', name: 'xyz'}
    ];

    const wb = XLSX.utils.book_new();                     // create workbook
    const ws = XLSX.utils.json_to_sheet(data);            // convert data to sheet
    XLSX.utils.book_append_sheet(wb, ws, 'users_sheet');  // add sheet to workbook

    const filename = "users.xlsx";
    const wb_opts = {bookType: 'xlsx', type: 'binary'};   // workbook options
    XLSX.writeFile(wb, filename, wb_opts);                // write workbook file

    const stream = fs.createReadStream(filename);         // create read stream
    stream.pipe(res);                                     // send to client
});

server.listen(8080);
Run Code Online (Sandbox Code Playgroud)