无法使用Firebase Cloud功能创建xlsx文件

时间:2018-07-05 17:05:29

标签: node.js firebase google-cloud-functions

我遵循了basic usage tutorial for excel4node软件包。

为了运行代码,我有一个https函数,它将在本地系统上与Excel.xlsx所在的目录中创建一个index.js文件。

但是,问题是,每次我调用该函数时,都会创建一个零字节的Excel.xls文件。

功能体是这样的:

const createXlxsFile = (req, res) => {
  const xl = require('excel4node');

  // Create a new instance of a Workbook class
  const workbook = new xl.Workbook();

  // Add Worksheets to the workbook
  const worksheet = workbook.addWorksheet('Sheet 1');
  const worksheet2 = workbook.addWorksheet('Sheet 2');

  // Create a reusable style
  const style = workbook.createStyle({
    font: {
      color: '#FF0800',
      size: 12
    },
    numberFormat: '$#,##0.00; ($#,##0.00); -'
  });

  // Set value of cell A1 to 100 as a number type styled with paramaters of style
  worksheet.cell(1, 1).number(100).style(style);

  // Set value of cell B1 to 300 as a number type styled with paramaters of style
  worksheet.cell(1, 2).number(200).style(style);

  // Set value of cell C1 to a formula styled with paramaters of style
  worksheet.cell(1, 3).formula('A1 + B1').style(style);

  // Set value of cell A2 to 'string' styled with paramaters of style
  worksheet.cell(2, 1).string('string').style(style);

  // Set value of cell A3 to true as a boolean type styled with paramaters of style but with an adjustment to the font size.
  worksheet.cell(3, 1).bool(true).style(style).style({ font: { size: 14 } });

  workbook.write('Excel.xlsx');

  res.end('DOC CREATED');
};

此代码可与标准Node.js正常运行,但不适用于Firebase云功能。使用功能编写文件是否有限制?

即使使用Xlsx-populate package,我也遇到同样的问题。

2 个答案:

答案 0 :(得分:2)

好。找出问题所在。

问题是云功能不允许您写入操作系统中的任何目录。

您唯一有权访问的地方是云功能中的/tmp

但是,在本地PC上,这也会崩溃(在Windows 10中测试)。可能是因为我没有创建C:/tmp文件夹。

要解决此问题,可以在Node.js中使用tmpdir()模块的os方法

const os = require('os');
const path = require('path');
const pathToSave = path.join(os.tmpdir(), 'Excel.xlsx');

在部署代码时,您需要将os.tmpdir()替换为`/ tmp'。

const pathToSave = path.join('/tmp', 'Excel.xlsx');

我希望这会有所帮助。

答案 1 :(得分:1)

workbook.write('Excel.xlsx');是异步的。文档说它需要一个回调,该回调在完成后被调用。使用它终止功能。现在,您要在写入完成之前提早终止。

  

wb.write();

     

write()方法可以接受单个文件名,即   带有回调函数或HTTP响应对象的文件名。

wb.write('ExcelFile.xlsx', function (err, stats) {
    if (err) {
        res.send(500);
    } else {
        res.end('DOC CREATED');
    }
});

看来这也可能起作用:

wb.write('ExcelFile.xlsx', res);