在存储工作表的Excel 文件中,如果行和单元格具有值或设置,则仅存储它们。不存储其他行和单元格。否则,即使不使用这些行和单元格,每个工作表都必须存储所有可能的行和单元格。那会浪费文件内存。
如果行包含具有值或设置的单元格,则它们具有值。如果行具有与默认值不同的行样式或特殊行高,则行具有设置。
如果单元格设置了单元格值,则单元格具有值。如果单元格具有单元格样式,则单元格具有设置。
也可能存储单元格,即使它们完全空白且没有样式。这取决于使用的电子表格软件。这主要发生在单元格存在然后被删除或单元格被复制/粘贴时。
apache poi 的 Sheet.getRow 和 Row.getCell 方法不会将行或单元格存储为 null。换句话说,只有存储的行和单元格不是null。所以你总是需要在Sheet.getRow和Row.getCell之后检查null:
...
Row row = sheet.getRow(3); if (row == null) row = sheet.createRow(3);
Cell cell = row.getCell(3); if (cell == null) cell = row.createCell(3);
...
之后,您可以确定拥有 Row row 和 Cell cell 而不是 null。
对于Cell,您也可以使用Row.getCell(int cellnum, Row.MissingCellPolicy policy)。请参阅 (Row.MissingCellPolicy)。
还有CellUtil 提供方法CellUtil.getRow(int rowIndex, Sheet sheet) 和CellUtil.getCell(Row row, int columnIndex)。如果无法获取,则两者都在创建行或单元格。
如果您只需要遍历填充的行和单元格,那么您可以使用 Iterate over rows and cells 中描述的迭代器。迭代器永远不会有null 行或单元格。但是,您可能会错过完全空白的行或跳过行中的空白单元格。为了避免这种情况,请阅读下面的“迭代单元格,控制缺失/空白单元格”。