Search code examples
javascriptnode.jsexcelexceljs

Load Array with Excel Data and Return it


Can anyone assist me with loading an array with excel data and returning it as a function? This is my initial code:

var excel = require('exceljs');

var wb = new excel.Workbook();
var path = require('path');
var filePath = path.resolve(__dirname,'data.xlsx');

function signIn(){
    var SignIn = [];
    wb.xlsx.readFile(filePath).then(function(){
        var sh = wb.getWorksheet("Sheet1");
        for(var i = 1; i < 3; i++){
            SignIn.push(sh.getRow(i).getCell(2).value);
        }
    });
    return SignIn
}

Solution

  • Workbook.readFile is aynchronous, you need to use either a callback or promise type approach. Using promises we can try:

    var excel = require('exceljs');
    var wb = new excel.Workbook();
    var path = require('path');
    var filePath = path.resolve(__dirname,'data.xlsx');
    
    function signIn() {
        var SignIn = [];
        return wb.xlsx.readFile(filePath).then( () => {
            var sh = wb.getWorksheet("Sheet1");
            for(var i = 1; i < 3; i++){
                SignIn.push(sh.getRow(i).getCell(2).value);
            }
            return SignIn;
        });
    }
    
    async function testReadData() {
        try {
            let data = await signIn();
            console.log('testReadData: Loaded data: ', data);
        } catch (error) {
            console.error('testReadData: Error occurred: ', error);
        }
    }
    testReadData();
    

    Or you can use a callback type approach:

    function signInWithCallback(callback) {
        var SignIn = [];
        wb.xlsx.readFile(filePath).then(function(){
            var sh = wb.getWorksheet("Sheet1");
            for(var i = 1; i < 3; i++){
                SignIn.push(sh.getRow(i).getCell(2).value);
            }
            callback(SignIn);
        });
    }
    
    signInWithCallback((data) => console.log('Callback: Data: ', data));