Search code examples
node.jsexceljs

Modifying an xlsx file with ExcelJS and NodeJS


My goal here is to read an xlsx file in, add a row, and output it. Simple enough right?

This is the code I have so far:

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

I believe this should read that data from "input.xlsx," write a row in addition to the data already on the sheet, and output it. Instead of copying the file, it creates an empty "output.xlsx."

I know I'm doing something stupid, also I'm totally new to nodeJS. Any thoughts?


Solution

  • The problem you are experiencing is connected with Node.js asynchronous nature. When you call readFile(filename1) it starts reading file. But it's an async (non-blocking) function so the code after this line gets executed before the reading is done.

    There are multiple ways to handle this: callbacks (called when the async call is done), promises (.then will be called when the call is executed), ES6 generators and ES7 async/await keywords.

    exceljs works with promises (as per docs) so you can do the following:

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

    Also please make sure that 'Sheet 1' actually exists because for me the default name was 'Sheet1'.

    There are many articles like this on this topic on the internet.