pheromix
pheromix

Reputation: 19287

How to break out of a eachRow method?

If a condition is met then I want to stop looping the remaining rows :

var express = require('express');
var router = express.Router();
var Excel = require("exceljs");
var path = require("path");

router.get("/lireExcel/:nbRows", function(req, res) {
    var ret = [];
    var nb = req.params.nbRows;
    var i = 0;
    var filename = path.join(__dirname, 'test.xlsx');
    var workbook = new Excel.Workbook();
    workbook.xlsx.readFile(filename).then(function () {
        var sheet = workbook.getWorksheet(1);
        sheet.eachRow(function(enreg, rowNumber) {
            if (rowNumber > 1) { // after the header
                i++;
                if (i <= nb) { // get only the nb number of rows
                    var row = sheet.getRow(rowNumber);
                    var msisdn = row.getCell(1).value;
                    var matricule = row.getCell(2).value;
                    if (msisdn != null) {
                        ret.push({"msisdn":msisdn, "immatriculation":matricule});
                    }
                }
                else {
                    // how to get out of the loop here ?
                }
            }
        }
    }
});

How to get out of the eachRow method in this case ?

Upvotes: 1

Views: 2950

Answers (3)

michael.marid
michael.marid

Reputation: 144

const excelPromise = new Promise((resolve, reject) => {
    workbook.getWorksheet(1).eachRow(async(row, rowNumber) => {
        if (rowNumber > 1) {
            i++;
            if (i <= nb) { ... }
            else reject('Invalid ...');
            // finally resolve
            if(rowNumber == workbook.getWorksheet('data').rowCount) {
                resolve();
            }
        } 
    })
})

excelPromise.then((success) => {
      console.log(success);
    },
    (error) => {
      console.log(error);
});

Upvotes: 0

Paweł Siemienik
Paweł Siemienik

Reputation: 68

Two available ways to achieve it:

  1. I recommend using xlsx-import lib for importing data from excel files: https://www.npmjs.com/package/xlsx-import

  2. this is able to iterate through all rows:

const last = ws.rowCount; // it;s a getter, should be called once before
for(let i = 0; i < last; i++){

}
  1. (extra info): From version 4 ExcelJs will allow: https://github.com/exceljs/exceljs/pull/1135
const workbookReader = new ExcelJS.stream.xlsx.WorkbookReader('./file.xlsx');
for await (const worksheetReader of workbookReader) {
 for await (const row of worksheetReader) {
   // ...
   // break;
 }
}

It should be published in npm soon

Upvotes: 0

max
max

Reputation: 467

you can read row by row sequentially

for(let i = 0; i < totalRow; i++){

    result = getRow(i)  //you can do this with an asynchronous call      

    if (result == condition) {
        break;
    }
}

Upvotes: 1

Related Questions