Apache POI在空电子表格中看到列?

我有一个空的电子表格,但是当我用Apache POI(版本3.10)访问它时,它说它有1024列和20个物理列。
我真的删除了所有的单元格,只剩下一些格式,但没有内容。
如果我用LibreOffice Calc(版本4.1.3.2)删除一些列,列数只会增加 ! 这是怎么回事?
有没有一种可靠的方法来获得真正的列数(或连续的单元格)?

import java.net.URL; import org.apache.poi.ss.usermodel.*; public class Test { public static void main(final String... args) throws Exception { final URL url = new URL("http://aditsu.net/empty.xlsx"); final Workbook w = WorkbookFactory.create(url.openStream()); final Row r = w.getSheetAt(0).getRow(0); System.out.println(r.getLastCellNum()); System.out.println(r.getPhysicalNumberOfCells()); } } 

经过更多的调查,我想我发现了什么事情。

首先,POI的一些术语:在电子表格中有一些根本不存在的单元格 – 这些单元格被称为缺失未定义 /未定义。 然后有一些细胞被定义,但没有价值 – 这些被称为空白细胞。 这两种types的单元格在电子表格程序中都显示为空,并且无法在视觉上进行区分。

我的电子表格有一些LibreOffice在行尾添加的空白单元格(可能是一个bug)。 当我删除列时,LibreOffice似乎将后续单元格(包括空白单元格)向左移动,并在末尾添加更多空白单元格(最多1024个)。

而现在关键部分:既不getLastCellNum()也不getPhysicalNumberOfCells()忽略空白单元格。 getLastCellNum()给出最后一个定义的单元格, getPhysicalNumberOfCells()给出定义的单元格的数量,都包括空白单元格。 似乎没有任何方法可以跳过空白单元格。 getPhysicalNumberOfCells()的javadoc有些误导 – “如果只有列0,4,5有值,那么会有3”,但它实际上也是计算空白单元格,这实际上没有值。

所以我find的唯一解决scheme是循环遍历单元格,并检查它们是否为空。

注意: getLastRowNum()getFirstCellNum()是基于0的,但getLastCellNum()是基于1的,wtf?

最有可能的是你有一些格式适用于你行。 我有一个用excel创build的空xlsx文件, getRow方法为空行生成null。