1

这是我使用 exceljs 编写和下载 excel 文件的代码。

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 文件| 不可读的图像| 损坏的图像| 邮递员回应

4

2 回答 2

1

尝试添加Content-Type标题:

res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

CSV 文件的格式是原始文本,因此易于阅读,无需关心 MIME 类型。xlsx 格式比较复杂。如果您不设置内容类型,浏览器将不知道如何处理该文件

于 2018-07-31T18:37:00.257 回答
0

我解决了这个问题。希望这对您有所帮助。如果您从服务器端下载此 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')
                }
            })
于 2020-05-15T22:44:55.467 回答