[英]Apache POI Read xlsx NPE
我正在尝试使用此处问题中的确切代码阅读Excel电子表格。 一切正常,但有时我会在这行代码的某些单元格上获得NPE:
String value = cell.toString();
这是为什么? 如何在我的工作表中间某些单元格为空? 不可否认,我获得NPE的单元格不包含数据。 但并非所有空单元都会导致NPE。
同样(如果我在NPE检查中包装这一行)我最终会得到一些显然为null的行:
XSSFRow row = ws.getRow(i);
同样,这些是我的电子表格中间没有数据的行。 但并非所有空行都会导致NPE。
显然,在这两种情况下执行null检查解决了我的直接问题。 我只是想知道为什么对象有时会为空。 必须有一些逻辑。 我只是没有看到它。
谢谢。
所有行都不Row
对象。 考虑一下,当您在Excel中启动新电子表格时,最多可以有1,048,576行,但保存空电子表格会导致文件大小很小。 也就是说,对不存在的行的引用将导致绝对巨大的文件。 只有在存在与它们相关联的某种内容时才应存储对行的引用 - 任何单元格值,格式,边框等。行可能显示为空白但有一些格式或者可能用于使内容现在消失。 Cell
连续有一个类似的论点。 对于甚至不使用的单元格,没有理由使用Cell
引用。 但是你可以删除Cell
的内容,而不是删除Cell
本身; 它可以是CELL_TYPE_BLANK
单元格。
如果它从未存在过,那么它将为null
。 即使它没有内容,它也可能具有需要表示的格式,因此它不会为null
。 如果它曾经有内容或格式,那么它将不会为null
除非有人明确删除它,在Excel中使用右键单击 - >删除或在POI中使用removeCell
或removeRow
。
如果该行没有任何内容,那么它可以为null
。 正如你所提到的,您可以随时查询Row
通过返回getRow
如果它是null
访问它之前,你可以随时查询Cell
由归国getCell
如果它是null
访问它。 您还可以提供Row.MissingCellPolicy
来getCell
来控制该方法的行为。 CREATE_NULL_AS_BLANK
尚不存在,则会为您创建Cell
。 想象一下,一Row
有16,384个Cell
,通常只需要几个。
(还有其他缺少的单元格策略RETURN_BLANK_AS_NULL
执行相反的操作;如果它存在但是为空,则返回null
。默认情况下, RETURN_NULL_AND_BLANK
只返回那些没有任何其他操作的内容。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.