2

我有一个空的电子表格,但是当我使用 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());
    }
}
4

3 回答 3

4

经过更多调查,我想我知道发生了什么。

首先,来自 POI 的一些术语:电子表格中实际上根本不存在一些单元格 - 这些单元格称为missingundefined /not defined。然后有一些已定义但没有值的单元格 - 这些单元格称为空白单元格。这两种类型的单元格在电子表格程序中都显示为空,并且无法从视觉上区分。

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

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

所以我找到的唯一解决方案是遍历单元格并检查它们是否为空白。

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

于 2014-02-27T17:49:24.780 回答
1

Most likely you have some kind of formatting applied for you row. I have an empty xlsx file created with excel and method getRow produces null for empty rows.

于 2014-02-27T14:08:10.557 回答
0

@aditsu 根据https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/Row.html, getLastCellNum() 获取此行中包含的最后一个单元格的索引加一。

+1 为 libreOffice 奋斗!这是一个错误,在我看来是非常随机的。我随机得到空值,如果我删除 EMPTY 行(波纹管)和 EMPTY 列(右侧),通常会有所帮助。...

于 2019-10-03T08:38:41.257 回答