Скачивание таблицы созданной через exceljs с сервера на express.js
На бэке есть массив с объектами для заполнения таблицы эксель, при нажатии кнопки (на фронте) должна создастся таблица и выгрузиться в браузер.
Раньше таблица выгружалась без использования бэка с использованием file-saver:
return workbook.xlsx
.writeBuffer()
.then((buffer) =>
FileSaver.saveAs(new Blob([buffer]), `${Date.now()}_Базовая таблица.xlsx`)
)
.catch((err) => console.log('Error writing excel export', err));
Сейчас добавлен бэкенд на экспрессе, поскольку у меня мало опыта, я не могу понять как выгружать созданный файл минуя запись на диск.
Запрос с фронта:
class Api {
constructor({ baseUrl, headers }) {
this._baseUrl = baseUrl;
this._headers = headers;
}
_checkRes(res) {
console.log(res)
if (res.ok) {
return res.json();
} else {
return res.text().then((err) =>
Promise.reject({
status: res.status,
message: JSON.parse(err).message,
})
);
}
}
getBasetabel(enterprise, jwt) {
return fetch(`${this._baseUrl}/tabels/base/${enterprise}`, {
headers: {
...this._headers,
Authorization: `Bearer ${jwt}`,
},
}).then(this._checkRes);
}
}
const api = new Api({
baseUrl: 'http://localhost:3001',
headers: {
'Content-Type': 'application/json',
},
});
Так вот, как мне правильно скачать сам файл без записи на диск? Пытался сам разобраться, но понял, что ищу в не верном направлении.
Заранее спасибо!
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
// @ts-check
const express = require('express');
const ExcelJS = require('exceljs');
const app = express();
app.get('/', (_req, res) => {
const workbook = new ExcelJS.Workbook();
workbook.title = 'abasj';
const worksheet = workbook.addWorksheet();
worksheet.addRow([3, 'Harley', new Date()]);
worksheet.addRow([4, 'Quinn', new Date()]);
/* Ручная отправка заголовков */
res.setHeader(
'Content-Type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
);
res.setHeader(
'Content-Disposition',
`attachment; filename="${Date.now()}_My_Workbook.xlsx"`
);
/* Stream "записи" содержимого xlsx перенаправляется в ответ сервера express */
workbook.xlsx.write(res)
.then(() => res.end())
.catch((err) => {
console.error(err);
res.status(500).send('SERVER_ERROR');
});
});
const port = 3001;
app.listen(
port,
() => console.log(`Example app listening on port ${port}`)
);