Мое любимое (потрясающее) решение:
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.