使用ExcelJS和NodeJS修改xlsx文件

sam*_*sam 1 node.js exceljs

我的目标是读取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);
Run Code Online (Sandbox Code Playgroud)

我相信这应该读取来自"input.xlsx"的数据,除了已经在工作表上的数据之外还要写一行,并输出它.它不是复制文件,而是创建一个空的"output.xlsx".

我知道我做的事情很蠢,而且我对nodeJS完全不熟悉.有什么想法吗?

Ant*_*ich 6

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

有多种方法可以解决这个问题:回调(在完成异步调用时调用),promises(.then将在执行调用时调用),ES6生成器和ES7 async/await关键字.

exceljs 使用promises(根据文档),以便您可以执行以下操作:

'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));
Run Code Online (Sandbox Code Playgroud)

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

有很多文章这样在互联网上这个话题.