Java Apache POI读取xlsx NPE

Java Apache POI读取xlsx NPE,java,excel,apache,apache-poi,Java,Excel,Apache,Apache Poi,我正在尝试使用问题中的确切代码阅读Excel电子表格。一切正常,但有时我会在这行代码的某些单元格上获得NPE: 为什么呢?在我的工作表中间,有些单元格怎么可能是空的?诚然,我获取NPE的单元格不包含数据。但并不是所有的空细胞都会导致NPE 类似地(如果我在NPE检查中换行),我最终会得到一些明显为空的行: 再次,这些是我的电子表格中间没有数据的行。但并非所有空行都会导致NPE 显然,在这两种情况下执行null检查可以解决我眼前的问题。我只是想知道为什么对象有时是空的。这一定是有道理的。我就是

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

为什么呢?在我的工作表中间,有些单元格怎么可能是空的?诚然,我获取NPE的单元格不包含数据。但并不是所有的空细胞都会导致NPE

类似地(如果我在NPE检查中换行),我最终会得到一些明显为空的行:

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

显然,在这两种情况下执行null检查可以解决我眼前的问题。我只是想知道为什么对象有时是空的。这一定是有道理的。我就是看不出来


谢谢。

不必为所有行设置
对象。试想一下,当您在Excel中启动一个新的电子表格时,最多可以有1048576行,但保存一个空的电子表格会导致文件大小变小。也就是说,对不存在的行的引用将导致一个绝对巨大的文件。对行的引用只应在存在与行相关联的某种内容(任何单元格值、格式、边框等)的情况下存储。行可能显示为空,但具有某种格式,或者可能过去包含的内容现在已不存在。行中的
单元格
s也有类似的参数。对于未使用的单元格,没有理由使用
单元格
引用。但是您可以删除
单元格
的内容,而不必删除
单元格
本身;它可以是
单元格\u类型\u空白
单元格

如果它从未存在过,那么它将是
null
。即使它没有内容,也可能有需要表示的格式,因此它不会是
null
。如果它以前有内容或格式,那么它就不会是
null
,除非有人在Excel中用右键单击->删除或在POI中用
removeCell
removow
显式删除它

如果行没有任何内容,那么它可以是
null
。正如您所提到的,在访问之前,您可以始终检查
getRow
返回的
行是否为
null
,并且在访问之前,您可以始终检查
getCell
返回的
单元格是否为
null
。您还可以提供
行.MissingCellPolicy
来控制该方法的行为
CREATE\u NULL\u AS\u BLANK
将为您创建
单元格(如果该单元格不存在)。想象一下,一个
行有16384个
单元格
,通常最多只需要几个


(还有其他缺少的单元格策略。
RETURN\u BLANK\u,因为\u NULL
的作用正好相反;如果它存在但为空,则将返回
NULL
。默认值为
RETURN\u NULL\u和\u BLANK
,只返回存在的内容,而无需任何其他操作。)

谢谢,这是有意义的。由于我无法控制接收的电子表格,因此在检索行或单元格后,我将执行空检查。
String value = cell.toString();
XSSFRow row = ws.getRow(i);