Как написать файл xls и поток для ответа в node js - PullRequest
3 голосов
/ 03 апреля 2020

То, что я пробовал, приведено ниже:

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)
}

После отправки клиенту статус ответа находится в состоянии ожидания, и через некоторое время происходит сбой. Я понятия не имею, что мне не хватает. Пожалуйста, ведите меня. Спасибо.

1 Ответ

2 голосов
/ 07 апреля 2020

Идея состоит в том, чтобы создать действительный файл Excel и затем передать его.

Соблюдать последовательность вызовов для создания рабочей книги и записи в нее данных 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);
...