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;
};

上記のコードのステップをデバッグすると、eachRow 関数で見つかった正しいデータが dataRows オブジェクトに取り込まれている場所を確認できます。ただし、「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 に答える