为什么即使单元格的值为空,“ cellIterator.hasNext()”却变为“ TRUE”

时间:2019-05-04 10:45:46

标签: java xssf hssf

考虑以下我的excelSheet的屏幕截图

enter image description here

现在考虑下面的代码,该代码将迭代每一行,然后迭代每个单元格,然后打印单元格值。

public void excelData2(int sheetNo) {
    Iterator<Row> rowIterator = workbook.getSheetAt(sheetNo).rowIterator();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();

        Iterator<Cell> cellIterator = row.cellIterator();
        while (cellIterator.hasNext()) {
            Cell cell = cellIterator.next();
            String cellValue = dataFormatter.formatCellValue(cell);
            System.out.print(cellValue + "\t");
        }
        System.out.println();
    }
}

实际上,通过查看excel表,我们可以看到正确的2行1列!!

因此,第一个while循环按预期进行了两次迭代:),但内部while的{​​{1}}循环则循环了26次而不是1次,即使下一个单元格有没有任何价值。理想情况下,在第二次迭代中cellIterator应该给出错误的权利?为什么它直到26次才给出真正的价值?有人有主意吗?

注意:我不想放置诸如cellIterator.hasNext()isEmpty()等的条件。

注意2:我想到了另一个解决方案,我可以解决。但是我想知道为什么会这样。

2 个答案:

答案 0 :(得分:2)

根据docs of POI(由LibreOffice使用):

org.apache.poi.xssf.streaming.SXSSFRow.CellIterator

  

返回所有单元格,包括空单元格

答案 1 :(得分:-1)

你可以使用这个并且可以跳过一次空白:

var abc = [{
    type: "manager",
    members: [{
      name: "bob"
    }, {
      name: "rob"
    }],
  },
  {
    type: "clerk",
    members: [{
      name: "foo"
    }, {
      name: "bar"
    }],
  },
];

const result = abc.map((obj) => {
  const isExist = obj.members.find((o) => o.name === "bob");
  if (isExist) isExist.isBob = true;

  return obj;
});

console.log(result);