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 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
行或单元格。但是你可能会错过完全空白的行或跳过行中的空白单元格。为避免这种情况,请阅读下方的“迭代单元格,控制缺失/空白单元格”。
我正在 excel sheet 借助 java 中的 apache POI 框架进行上传。我在填充的列之间插入了一个空列,在某些文件中,该特定列的单元格被视为空,而在某些文件中,列中的空单元格被视为空字符串?为什么会这样?我使用 google sheets.
在 excel 中插入了一个空列此外,要理解这个问题,请考虑使用我们在 row.getCell()
方法中使用的 Row.CREATE_NULL_AS_BLANK
缺失策略。 excel sheet 什么时候我们可以使用此缺失策略的单元格具有空值?
在存储 sheet 的 Excel
文件中,仅存储具有值或设置的行和单元格。不存储其他行和单元格。否则每个 sheet 总是必须存储所有可能的行和单元格,即使不使用这些行和单元格也是如此。那会浪费文件内存。
如果行包含具有值或设置的单元格,则行具有值。如果行具有与默认值不同的行样式或特殊行高,则行具有设置。
如果单元格设置了单元格值,那么单元格就有值。如果单元格具有单元格样式,则单元格具有设置。
也可能是存储了单元格,即使它们完全空白且没有样式。这取决于所使用的 spreadsheet 软件。这主要发生在细胞存在然后被删除或细胞 copy/pasted.
时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
行或单元格。但是你可能会错过完全空白的行或跳过行中的空白单元格。为避免这种情况,请阅读下方的“迭代单元格,控制缺失/空白单元格”。