【问题标题】:Apache POI Read xlsx NPEApache POI 读取 xlsx NPE
【发布时间】:2014-03-18 16:21:25
【问题描述】:

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

String value = cell.toString();

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

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

XSSFRow row = ws.getRow(i);

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

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

谢谢。

【问题讨论】:

    标签: java excel apache apache-poi


    【解决方案1】:

    并非所有行都必须有 Row 对象。想想看,当您在 Excel 中开始一个新的电子表格时,您最多可以有 1,048,576 行,但保存一个空的电子表格会导致文件大小很小。也就是说,对不存在的行的引用将导致一个绝对 巨大 文件。仅当存在与行相关联的某种内容时,才应存储对行的引用——任何单元格值、格式、边框等。一行可能显示为空白但有一些格式,或者它曾经有现在已经消失的内容. Cells 也有类似的说法。没有理由为甚至未使用的单元格提供Cell 参考。但是您可以删除 Cell 的内容,而不是删除 Cell 本身;它可以是CELL_TYPE_BLANK 单元格。

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

    如果该行没有任何内容,那么它可能是null 是有道理的。正如您所提到的,您始终可以在访问之前检查getRow返回的Row是否为null,并且您始终可以在访问之前检查getCell返回的Cell是否为null。您还可以提供 Row.MissingCellPolicygetCell 来控制该方法的行为。 CREATE_NULL_AS_BLANK 将为您创建 Cell(如果它尚不存在)。想象一下,Row 有 16,384 个Cells,通常最多只需要几个。

    (还有其他缺失的单元格策略。RETURN_BLANK_AS_NULL 则相反;如果它存在但为空白,则将返回 null。默认值 RETURN_NULL_AND_BLANK 仅返回存在的任何内容而无需任何其他操作。 )

    【讨论】:

    • 谢谢,这是有道理的。由于我无法控制收到的电子表格,因此我将在检索行或单元格后进行空值检查。
    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    相关资源
    最近更新 更多