2017-02-17 577 views
1

我的目标是读取一个xlsx文件,添加一行并输出它。够简单吧?用ExcelJS和NodeJS修改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全新的东西。有什么想法吗?

+1

您是否确实在第一本书中有一张工作表“Sheet 1”?在我的Excel中,默认的工作表名称是“Sheet1”(没有空格) –

+1

我将在exceljs中添加基本操作看起来没问题 - 但在你走得太远之前,先看看GitHub上的问题跟踪器,并确保您需要的任何功能都可以充分工作。 –

+0

其实,我从Excel文档中改变了“Sheet 1”,因为表格的名字是别人的名字,我不想在网上发布......只要说我已经双重检查,名称是正确的。 – sam

回答

5

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

处理此问题有多种方式:回调(在异步调用完成时调用),承诺(当调用执行时调用。),ES6生成器和ES7异步/等待关键字。

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

也请确保“表1”确实存在,因为我的默认名称是'Sheet1'。

关于这个话题在互联网上有很多文章like this