gpt4 book ai didi

java - Apache POI 读取 xlsx NPE

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:25:16 36 4
gpt4 key购买 nike

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

String value = cell.toString();

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

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

XSSFRow row = ws.getRow(i);

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

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

谢谢。

最佳答案

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

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

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

(还有其他缺失的单元格策略。RETURN_BLANK_AS_NULL 做相反的事情;如果存在但为空,则返回null。默认,RETURN_NULL_AND_BLANK ,只返回那里没有任何其他操作的任何内容。)

关于java - Apache POI 读取 xlsx NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485170/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com