【问题标题】:Apache POI seeing columns in empty spreadsheet?Apache POI 看到空电子表格中的列?
【发布时间】:2014-02-27 13:59:21
【问题描述】:

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

【问题讨论】:

  • 你为什么不使用 XSSF 包?尝试使用它来读取 xlsx。
  • 据我所知,具有格式的单元格已初始化,具有该样式的列也是如此。
  • @anonymous WorkbookFactory 是访问电子表格的首选方式。它根据需要在内部使用 XSSF 或 HSSF。
  • 删除行后检查...
  • 如果一个单元格应用了格式,那么它就不是空的!格式化信息必须存在于某个地方,并且某个地方是一个空白单元格

标签: java excel apache-poi libreoffice-calc


【解决方案1】:

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

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

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

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

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

旁注:getLastRowNum()getFirstCellNum() 是从 0 开始的,而 getLastCellNum() 是从 1 开始的,这是怎么回事?

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 你可以查看我的文件。是的,我可能有一些格式,那又怎样?仍然应该有一种方法可以获得正确的列数。
    • 对不起,我没有注意到它的在线
    • 您的第 0 行似乎只有几个具有某种状态的单元格,即 1004-1023,还不知道是什么。
    • 这听起来像是一个愚蠢的问题,但是......你如何删除该列?您是标记单元格并按删除还是使用上下文菜单中的操作?
    • LibreOffice 创建或修改的xlsx 文件似乎总是有大量的行和列被 POI 读取为不为空。使用 LibreOffice 编辑后,我有 5 行的 Excel 文件有 65565(?) 行。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多