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

Java Apache POI在空电子表格中看到列?,java,excel,apache-poi,libreoffice-calc,Java,Excel,Apache Poi,Libreoffice Calc,我有一个空的电子表格,但当我用ApachePOI(3.10版)访问它时,它说它有1024列和20个物理列。 我确实删除了所有单元格,只保留了一些格式,但没有内容。 如果我用libreofficecalc(版本4.1.3.2)删除了一些列,那么只的列数会增加!发生了什么事? 是否有可靠的方法获取列(或行中的单元格)的真实数量 最有可能的是,您已经为您的行应用了某种格式。我有一个用excel创建的空xlsx文件,方法getRow为空行生成空值。很可能对行应用了某种格式。我有一个用excel创建的空x

我有一个空的电子表格,但当我用ApachePOI(3.10版)访问它时,它说它有1024列和20个物理列。
我确实删除了所有单元格,只保留了一些格式,但没有内容。
如果我用libreofficecalc(版本4.1.3.2)删除了一些列,那么只的列数会增加!发生了什么事?
是否有可靠的方法获取列(或行中的单元格)的真实数量


最有可能的是,您已经为您的行应用了某种格式。我有一个用excel创建的空xlsx文件,方法
getRow
为空行生成空值。

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

经过进一步的调查,我想我知道发生了什么

首先,来自POI的一些术语:电子表格中有一些单元格实际上根本不存在-它们被称为缺失,或未定义/未定义。然后有一些已定义但没有值的单元格-这些单元格称为空白单元格。这两种类型的单元格在电子表格程序中都显示为空,无法直观区分

我的电子表格有一些空白单元格,LibreOffice在行的末尾添加了这些单元格(可能是一个bug)。当我删除列时,LyBrice似乎将后续的单元格(包括空白单元格)移到左边,并在结尾添加了更多的空白单元格(高达1024)。 现在是关键部分:既不要
getLastCellNum()
也不要
getPhysicalNumberOfCells()
忽略空白单元格
getLastCellNum()
给出最后定义的单元格,而
getPhysicalNumberOfCells()
给出定义的单元格的数量,两者都包括空白单元格。似乎没有任何方法可以跳过空白单元格。
getPhysicalNumberOfCells()
的javadoc有点误导——“如果只有列0,4,5有值,那么就会有3”,但实际上它也在计算空白单元格,而空白单元格实际上没有值

所以我找到的唯一解决办法是循环遍历单元格,检查它们是否为空


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

经过进一步的调查,我想我知道发生了什么

首先,来自POI的一些术语:电子表格中有一些单元格实际上根本不存在-它们被称为缺失,或未定义/未定义。然后有一些已定义但没有值的单元格-这些单元格称为空白单元格。这两种类型的单元格在电子表格程序中都显示为空,无法直观区分

我的电子表格有一些空白单元格,LibreOffice在行的末尾添加了这些单元格(可能是一个bug)。当我删除列时,LyBrice似乎将后续的单元格(包括空白单元格)移到左边,并在结尾添加了更多的空白单元格(高达1024)。 现在是关键部分:既不要
getLastCellNum()
也不要
getPhysicalNumberOfCells()
忽略空白单元格
getLastCellNum()
给出最后定义的单元格,而
getPhysicalNumberOfCells()
给出定义的单元格的数量,两者都包括空白单元格。似乎没有任何方法可以跳过空白单元格。
getPhysicalNumberOfCells()
的javadoc有点误导——“如果只有列0,4,5有值,那么就会有3”,但实际上它也在计算空白单元格,而空白单元格实际上没有值

所以我找到的唯一解决办法是循环遍历单元格,检查它们是否为空

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

@aditsu根据,getLastCellNum()获取此行中包含的最后一个单元格的索引加上一个

+1为libreOffice strugle!这是一个错误,在我看来是非常随机的。我随机得到null,如果我删除空行(下面)和空列(右侧),通常会有所帮助。 …

@aditsu根据,getLastCellNum()获取此行中包含的最后一个单元格的索引加上一个

+1为libreOffice strugle!这是一个错误,在我看来是非常随机的。我随机得到null,如果我删除空行(下面)和空列(右侧),通常会有所帮助。

您为什么不使用XSSF软件包?试着用它来读取xlsx。据我所知,具有格式的单元格是初始化的,具有该样式的列也是初始化的。@anonymous WorkbookFactory是访问电子表格的首选方法。它根据需要在内部使用XSSF或HSSF。删除行后检查…如果单元格应用了格式,则该行不是空的!格式化信息必须存在于某个地方,而某个地方是一个空白单元格。为什么不使用XSSF包?试着用它来读取xlsx。据我所知,具有格式的单元格是初始化的,具有该样式的列也是初始化的。@anonymous WorkbookFactory是访问电子表格的首选方法。它根据需要在内部使用XSSF或HSSF。删除行后检查…如果单元格应用了格式,则该行不是空的!格式化信息必须存在于某个地方,而某个地方作为空白单元格,您可以检查我的文件。是的,我可能有一些格式,那又怎样?应该还有一种方法可以获得正确的列数。抱歉,我没有注意到它是联机的。在您的第0行中,似乎只有少数具有某种状态的单元格,它们是1004-1023,还不知道是什么。这听起来可能是个愚蠢的问题,但是。。。如何删除该列?是否标记单元格并按delete或d键
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());
    }
}