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