繁体   English   中英

Apache POI阅读xlsx NPE

[英]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中使用removeCellremoveRow

如果该行没有任何内容,那么它可以为null 正如你所提到的,您可以随时查询Row通过返回getRow如果它是null访问它之前,你可以随时查询Cell由归国getCell如果它是null访问它。 您还可以提供Row.MissingCellPolicygetCell来控制该方法的行为。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM