exceljs пишет файл правильно в формате csv, но файл поврежден для формата xlsx
Это мой код для написания и загрузки файла Excel с использованием ExcelJS.
const excel = require('exceljs')
const tempfile = require('tempfile')
var workbook = new excel.Workbook()
var sheet1 = workbook.addWorksheet('sample')
sheet1.columns = req.keys // Some data
var tempFilePath = tempfile('.csv')
workbook.csv.writeFile(tempFilePath).then(function() {
res.download(tempFilePath, 'sample.csv', function(err) {
if (err) {
res.status(500).json({
"success": false,
"error": err
})
return
}
})
})
Когда я заменяю csv на xlsx, он пишет, но файл поврежден.
const excel = require('exceljs')
const tempfile = require('tempfile')
var workbook = new excel.Workbook()
var sheet1 = workbook.addWorksheet('sample')
sheet1.columns = req.keys // Some data
var tempFilePath = tempfile('.xlsx')
workbook.xlsx.writeFile(tempFilePath).then(function() {
res.download(tempFilePath, 'sample.xlsx', function(err) {
if (err) {
res.status(500).json({
"success": false,
"error": err
})
return
}
})
})
Приложили снимки этого здесь.
CSV-файл | Нечитаемое изображение | Поврежденное изображение | Ответ почтальона
1 ответ
Попробуйте добавить Content-Type
заголовок:
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
Формат файла CSV - необработанный текст, поэтому его легко читать, не обращая внимания на тип MIME. Формат xlsx более сложный. Если вы не установите тип содержимого, браузер не будет знать, что делать с файлом
Я решил проблему. Надеюсь, это тебе поможет. Если вы загрузите этот файл excel со стороны сервера (в моем случае Node JS). Проблема решается одной строчкой на стороне клиента: req.responseType = "arraybuffer";
requestData(req, "exportToExcel")
.then(resXHR => {
// For the correct processing of data from the server, you must specify the format/structure of data transfer
resXHR.responseType = "arraybuffer"
// Wait until the data is downloaded from the server
resXHR.onload = function () {
// Call a modal window for saving with type and file name
saveAs(new Blob([resXHR.response], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }), 'users.xlsx')
}
})