查找Excel电子表格中的最后一行

Fro*_*ada 13 java excel apache-poi

我正在尝试使用Apache的POI for Java查找Excel电子表格中最后一行的索引.

我想这应该是可能的getLastRowNum()getPhysicalNumberOfRows(),但似乎他们不给予正确的结果.例如,我有一行电子表格,这两个函数返回值1140.另外两行电子表格的值为1162.

另一个问题是我不能只查找第一个空行,因为有效数据行之间可能有空行.

那么有没有办法找到最后一行的索引?我想我可以要求在数据之间没有空行,但我希望有更好的解决方案.

编辑:对于使用迭代器的记录没有帮助.它只是迭代了1140/1162所谓的行.

tra*_*god 12

我使用poi-3.6-20091214获得了预期的输出,并且test.xls有两个空行,后跟三个占用行:

InputStream myxls = new FileInputStream("test.xls");
Workbook book = new HSSFWorkbook(myxls);
Sheet sheet = book.getSheetAt(0);
System.out.println(sheet.getLastRowNum());
Run Code Online (Sandbox Code Playgroud)

输出: 4

  • 这将在正常情况下工作.. (2认同)

小智 6

您可以使用以下方法获取原始行计数.

HSSFSheet worksheet = workbook.getSheet("Role_Mapping");
int rowsNum = worksheet.getPhysicalNumberOfRows();
Run Code Online (Sandbox Code Playgroud)

  • 如果顶部有空行或散布在数据中,这将不起作用。 (2认同)

rea*_*ven 5

我以前也遇到过同样的问题。这可能是由 Excel 单元格在 Excel 中编辑然后清空引起的。一旦它们被触摸,它们就会显示为使用过的细胞。

我使用这个技巧来删除(不仅仅是清空)这些单元格,并获得正确的返回行值:

  1. 打开 Excel 文件并转到预期的工作表。
  2. 选择最后一行 + 1。例如,您有 12 行数据,然后单击第 13 行。
  3. 选择整行 [Shift]-[Space]
  4. 选择工作表底部的所有行 [Ctrl]-[Shift]-[向下箭头]
  5. 删除所有选中的行 [Ctrl]-[减号]
  6. 保存您的工作簿
  7. 重新运行代码并检查返回值。

这不是 POI 库的问题。


Dón*_*nal 1

我知道如何使用 VBA 解决您的问题,但我不确定如何从 Apache POI 界面获取等效信息。在 VBA 中,要获取工作表“Sheet1”中已使用单元格的范围,请使用:

Worksheets("Sheet1").UsedRange
Run Code Online (Sandbox Code Playgroud)

这将返回一个Range对象,该对象具有提供更多信息的属性。例如,要获取 this 中的行数Range,请使用:

Worksheets("Sheet1").UsedRange.Rows
Run Code Online (Sandbox Code Playgroud)

同样,我不确定这是否可以通过 POI API 访问,但如果不能,也许它提供了一种执行任意 VBA 片段的方法?