Необходимо создать файл Excel и загрузить его в клиентском браузере. Можно ли создать поток файлов и отправить его в ответе Node Express? - PullRequest
0 голосов
/ 26 мая 2020

Я хотел бы создать поток файла Excel в узле Express и отправить файл Excel в ответе узла Express, который затем будет загружен браузером клиента. Проблема в том, что у меня нет опыта работы с потоками, и я даже не уверен, что это возможно.

Немного предыстории: я использую пакет узлов Excel Js (https://www.npmjs.com/package/exceljs) для создания документа Excel. Я прекрасно могу создать файл Excel. Я знаю, что Express предоставляет возможность res.download для загрузки файлов в клиентский браузер, но я думаю, что res.download требует фактического файла с путем для загрузки в клиентский браузер. Этот код будет размещен на AWS, и я хочу избежать необходимости создавать и сохранять файл в S3, прежде чем захватить файл и загрузить его в клиентский браузер.

Excel JS имеет возможность создать; файл, поток или буфер Excel. Можно ли создать поток с необходимыми данными, а затем отправить этот файловый поток в ответ для загрузки в браузере клиента?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Мое любимое (потрясающее) решение:

res.xlsx('awesome-template.xlsx', awesomeViewModel, 'report.xlsx');

Мое любимое решение - расширить объект ответа функцией xlsx, которая генерирует файл с использованием шаблона с моделью представления и записывает его в res ( загрузить в браузер)

import {Renderer} from 'xls-renderer'

const renderer = new Renderer();

router.use((req, res, next) => { // register middleware

  res.xlsx = (template, vm, fileName) => { // add function into res object
    const workbook = renderer.renderFromFile(template, vm);

    res.set({
      'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'Content-Disposition': `attachment; filename="${filenName}"`,
    });

    await (await workbook).xlsx.write(res);
  };


  next();
});

Альтернативные решения:

I. Excel JS workbook.xlsx.write(res) способ:

import {Workbook} from 'exceljs'

// creation code
const wb = new Workbook();
// ... const wsA = wb.addWorksheet("WsA");

// response headers
res.set({
  'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  'Content-Disposition': `attachment; filename="from-exceljs.xlsx"`,
});

// write into response
wb.xlsx.write(res);

II. чистый способ XlsxRender:

npm install --save xlsx-renderer
const workbook = renderer.renderFromFile('template.xlsx', viewModel);

res.set({
    'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'Content-Disposition': `attachment; filename="from-xlsx-renderer.xlsx"`,
});

await (await workbook).xlsx.write(res); // yeah, it returns ExcelJs Workbook, so same as above.
0 голосов
/ 27 мая 2020

//Create a middleware and a readable stream

const excelStream = //generate your excel stream here

//Filestream middleware
const streamW = () => {
return (req, res, next) => {

//Pipe the excel stream to the response
excelStream.pipe(res)
 next()
  }
}


router.get('/excelstream', streamW()/* consume the middleware*/, (req, res) => {
 //Send the data to the front end
 res
});

...