Apache POI阅读xlsx NPE

时间:2014-03-18 16:21:25

标签: java excel apache apache-poi

我正在尝试使用问题here中的确切代码阅读Excel电子表格。一切正常,但有时我会在这行代码的某些单元格上获得NPE:

String value = cell.toString();

为什么?如何在我的工作表中间某些单元格为空?不可否认,我获得NPE的单元格不包含数据。但并非所有空单元都会导致NPE。

同样(如果我在NPE检查中包装这一行)我最终会得到一些显然为null的行:

XSSFRow row = ws.getRow(i);

同样,这些是我的电子表格中间没有数据的行。但并非所有空行都会导致NPE。

显然,在这两种情况下执行null检查解决了我的直接问题。我只是想知道为什么对象有时会为空。必须有一些逻辑。我只是没有看到它。

感谢。

1 个答案:

答案 0 :(得分:2)

所有行都不必有Row个对象。考虑一下,当您在Excel中启动新电子表格时,最多可以有1,048,576行,但保存空电子表格会导致文件大小很小。也就是说,对不存在的行的引用将导致绝对巨大的文件。只有在存在与它们相关联的某种内容时才应存储对行的引用 - 任何单元格值,格式,边框等。行可能显示为空白但有一些格式或者可能用于使内容现在消失。 Cell连续存在类似的论点。对于甚至不使用的单元格,没有理由Cell引用。但是,您可以删除Cell的内容,而不删除Cell本身;它可以是CELL_TYPE_BLANK单元格。

如果它从未存在过,那么它将是null。即使它没有内容,也可能需要表示格式,因此它不会是null。如果它曾经有内容或格式,那么它将不是null,除非有人明确删除它,无论是在Excel中使用右键单击 - >使用removeCellremoveRow删除或使用POI。

如果该行没有任何内容,那么它可能是null。如您所述,在访问之前,您可以随时查看Row返回的getRow,如果它是null,您可以随时查看Cell返回的getCell如果在访问它之前它是null。您还可以提供Row.MissingCellPolicygetCell来控制该方法的行为。 CREATE_NULL_AS_BLANK会为您创建Cell(如果它尚不存在)。想象一下Cell有16,384 Row s,通常只需要几个{。}}。

(还有其他缺少的单元格策略。RETURN_BLANK_AS_NULL执行相反的操作;如果它存在但是空白,则会返回null。默认值RETURN_NULL_AND_BLANK只会返回任何内容没有任何其他行动。)