我有一个空电子表格,但当我使用 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的一些术语:有一些单元格实际上根本不存在于电子表格中 - 这些单元格称为 丢失的, , 或者 不明确的/没有定义的。然后有一些已定义的单元格,但没有值 - 这些单元格称为 空白的 细胞。这两种类型的单元格在电子表格程序中都显示为空,并且无法在视觉上区分。

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

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

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

边注: getLastRowNum()getFirstCellNum() 是从 0 开始的,但是 getLastCellNum() 是从 1 开始的,wtf?

其他提示

您很可能对您的行应用了某种格式。我有一个用 excel 和方法创建的空 xlsx 文件 getRow 为空行生成 null。

@aditsu按 https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/row.html ,getlastcellnum()获取此行加上的最后一个单元格的索引。

libreoffice strugle的

+1!这是一个错误,在我看来是非常随机的。我随机地获得空缺,经常有助于删除空行(波纹管)和空列(在右侧)。 ...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top