1

我的目标是读取一个 xlsx 文件,添加一行并输出它。够简单吧?

这是我到目前为止的代码:

var filename1="input.xlsx";
var filename2="output.xlsx";
var Excel = require('exceljs');
var workbook = new Excel.Workbook();
workbook.xlsx.readFile(filename1);
workbook.getWorksheet("Sheet 1").addRow([1,2,3]);
workbook.xlsx.writeFile(filename2);

我相信这应该从“input.xlsx”中读取数据,除了已经在工作表上的数据之外还写一行,然后输出。它不是复制文件,而是创建一个空的“output.xlsx”。

我知道我在做一些愚蠢的事情,而且我对 nodeJS 完全陌生。有什么想法吗?

4

1 回答 1

9

您遇到的问题与 Node.js 异步性质有关。当您调用readFile(filename1)它时,它开始读取文件。但它是一个异步(非阻塞)函数,因此该行之后的代码会在读取完成之前执行。

有多种方法可以处理这个问题:回调(在异步调用完成时调用)、承诺(在调用执行时将调用 .then)、ES6 生成器和 ES7 async/await 关键字。

exceljs使用承诺(根据文档),因此您可以执行以下操作:

'use strict';

const Excel = require('exceljs');
let filename1 = 'input.xlsx';
let filename2 = 'output.xlsx';
let workbook = new Excel.Workbook();
workbook.xlsx.readFile(filename1)
    .then(() => {
        workbook.getWorksheet('Sheet 1').addRow([1, 2, 3]);
        return workbook.xlsx.writeFile(filename2);
    }).then(() => {
        console.log('File is written');
    }).catch(err => console.error(err));

另外请确保“Sheet 1”确实存在,因为对我来说默认名称是“Sheet1”。

网上有很多关于这个话题的文章。

于 2017-02-17T06:45:10.390 回答