0

我正在使用 Node npm 库“ExcelJS”读取 Excel 工作簿的工作表,并使用代表工作表行中的数据的对象填充数组。

我不认为这个问题与 ExcelJS 直接相关,而可能是由于我对 Javascript 函数上下文缺乏了解。

编码:

getData = function () {
    var dataRows = [];

    workbook.xlsx.readFile("myExcelWorkbook").then(function () {
        var worksheet = workbook.getWorksheet("MyWorksheet");

        worksheet.eachRow(function (row) {
            var dataRow = {
                colA: row.getCell("A").value,
                colB: row.getCell("B").value,
                colC: row.getCell("C").value
            };

            dataRows.push(dataRow);
        });
    });

    return dataRows;
};

如果我通过上面的代码调试步骤,我可以看到 dataRows 对象在哪里填充了在 eachRow 函数期间找到的正确数据。但是,一旦退出“readFile”函数,填充到 dataRows 对象中的所有项目都会消失。

无论我如何尝试填充 dataRows(例如调用外部函数来填充 dataRows 数组),在 workbook.xslx.readFile() 的上下文中创建的任何对象似乎都会在之后被销毁。奇怪的。

4

1 回答 1

3

workbook.xlsx.readFile 是一个异步函数。您在异步执行之前返回 dataRows 。

请参阅如何从异步调用返回响应?

以下是使用回调解决此问题的简单方法。将期望 dataRows 输出的函数传递给 getData,然后在构建 dataRows 后调用它。同样,使用链接问题中解释的承诺有更好的解决方案。

getData = function (callback) {
    var dataRows = [];

    workbook.xlsx.readFile("myExcelWorkbook").then(function () {
        var worksheet = workbook.getWorksheet("MyWorksheet");

        worksheet.eachRow(function (row) {
            var dataRow = {
                colA: row.getCell("A").value,
                colB: row.getCell("B").value,
                colC: row.getCell("C").value
            };

            dataRows.push(dataRow);
        });

        callback(dataRows);
    });

    return dataRows;
};
于 2015-10-29T15:18:22.853 回答