Apache POI 框架何时将 excel 单元格视为空且为 null?

When does Apache POI framework consider a excel cell as empty and null?

我正在 excel sheet 借助 java 中的 apache POI 框架进行上传。我在填充的列之间插入了一个空列,在某些文件中,该特定列的单元格被视为空,而在某些文件中,列中的空单元格被视为空字符串?为什么会这样?我使用 google sheets.

在 excel 中插入了一个空列

此外,要理解这个问题,请考虑使用我们在 row.getCell() 方法中使用的 Row.CREATE_NULL_AS_BLANK 缺失策略。 excel sheet 什么时候我们可以使用此缺失策略的单元格具有空值?

在存储 sheet 的 Excel 文件中,仅存储具有值或设置的行和单元格。不存储其他行和单元格。否则每个 sheet 总是必须存储所有可能的行和单元格,即使不使用这些行和单元格也是如此。那会浪费文件内存。

如果行包含具有值或设置的单元格,则行具有值。如果行具有与默认值不同的行样式或特殊行高,则行具有设置。

如果单元格设置了单元格值,那么单元格就有值。如果单元格具有单元格样式,则单元格具有设置。

也可能是存储了单元格,即使它们完全空白且没有样式。这取决于所使用的 spreadsheet 软件。这主要发生在细胞存在然后被删除或细胞 copy/pasted.

apache poiSheet.getRowRow.getCell 方法未将行或单元格存储为 null。换句话说,只有存储的行和单元格没有 null。所以你总是需要在 Sheet.getRowRow.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 rowCell 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 行或单元格。但是你可能会错过完全空白的行或跳过行中的空白单元格。为避免这种情况,请阅读下方的“迭代单元格,控制缺失/空白单元格”。