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')
                }
            })
Другие вопросы по тегам