使用 Heroku 时如何保存 Excel 文件?

Posted

技术标签:

【中文标题】使用 Heroku 时如何保存 Excel 文件?【英文标题】:How to save Excel file when using Heroku? 【发布时间】:2019-11-30 18:16:17 【问题描述】:

我正在开发 Node.js / Express 项目,其中包括获取 Excel 文件的路径。我一直在使用 excel4node xlsx 生成库,它在本地机器上运行应用程序时效果很好。

但是在 Heroku 上使用该应用程序时,我收到错误 400,但没有任何有用的信息。

之前我在上传图片时遇到过同样的问题,Amazon S3 解决了这些问题。我的结论是,这也与 Heroku 的“临时文件系统”有关,但作为初学者的 Web 开发人员,我很难掌握这一点。

路线代码如下。这仅适用于本地计算机:

router.get("/excel", authenticate, (req, res) => 

    Product.find(quantity:  $gt: 0 ).sort( code: 1 ).then((products, e) => 

        const date = moment();
        const time = date.format("DD.MM.YYYY");
        const sheetName = `Stock $time`
        const workbookName = `Company XYZ stock $time.xlsx`
        const workbook = new excel.Workbook()
        const worksheet = workbook.addWorksheet(sheetName);

        const style = workbook.createStyle(
            font: 
                bold: true,
                size: 12
            
        );

        worksheet.cell(1, 1).string("Code").style(style);
        worksheet.cell(1, 2).string("Description").style(style);
        worksheet.cell(1, 3).string("Quantity").style(style);
        worksheet.cell(1, 4).string("Class").style(style);
        worksheet.cell(1, 5).string("Retail price").style(style);
        worksheet.cell(1, 6).string("Net price").style(style);

        products.forEach((product) => 

            const cell = products.indexOf(product) + 2

            worksheet.cell(cell, 1).string(product.code)
            worksheet.cell(cell, 2).string(product.description)
            worksheet.cell(cell, 3).number(product.quantity)
            worksheet.cell(cell, 4).string(product.class)
            worksheet.cell(cell, 5).number(product.price)
            worksheet.cell(cell, 6).number(product.netprice)
        )

        workbook.write(workbookName, res);

    ).catch((e) => 
        res.status(400).send();
    );
);

我应该如何操作代码,以便将生成的 excel 文件下载到用户的默认下载文件夹?我不想将文件保存在云存储中的任何位置。

谢谢!

更新:错误代码

2019-07-23T04:36:24.256616+00:00 app[web.1]: TypeError: Value sent to Number function of cells ["E181"] was not a number, it has type of object and value of null
2019-07-23T04:36:24.256629+00:00 app[web.1]:     at cellBlock.numberSetter [as number] (/app/node_modules/excel4node/distribution/lib/cell/index.js:77:15)
2019-07-23T04:36:24.256632+00:00 app[web.1]:     at products.forEach (/app/routes/products.js:117:37)
2019-07-23T04:36:24.256634+00:00 app[web.1]:     at Array.forEach (<anonymous>)
2019-07-23T04:36:24.256636+00:00 app[web.1]:     at Product.find.sort.then (/app/routes/products.js:109:18)
2019-07-23T04:36:24.256638+00:00 app[web.1]:     at process._tickCallback (internal/process/next_tick.js:68:7)

【问题讨论】:

catch 部分添加控制台日志。.catch((e) =&gt; console.log(e);... 并在问题中发布错误。 嘿 Aritra,从 Heroku 应用程序日志中添加了错误代码,请参阅上面的编辑消息。第一行表示数据有问题,因为它与本地数据库不同。 【参考方案1】:

已经解决了这个问题。它与 Heroku 的临时文件系统无关,这是我的第一个结论:

在我的数据库中有 1 个文档在预期 Number 的字段中有空值并导致此错误:TypeError: Value sent to Number function of cells ["E181"] is not a number, it has type对象和 null 值

我不必更改任何代码,只需为该字段赋值。就这么简单:)

【讨论】:

以上是关于使用 Heroku 时如何保存 Excel 文件?的主要内容,如果未能解决你的问题,请参考以下文章

多页Excel转换成PDF时如何保存为单独文件

如何使用 vb.net 保存 excel 文件?

如何使用python通过浏览器下载数据框

如何使用openpyxl将qtablewidget数据保存到excel文件中

如何保存到excel文件

使用 Parse Cloud 代码将文件保存在 Heroku 文件系统中?