如何用Apache POI或其他Java工具获取Excel工作表中单元格最多的行?
没问题,我来帮你搞定这个需求!下面是基于Apache POI实现找出Excel中单元格数量最多行的完整方案:
解决方法:用Apache POI定位单元格数量最多的行
核心思路就是遍历工作表的每一行,统计每行的单元格数量,同时记录最大值和对应的行号。这里要注意两个统计单元格数量的API差异,我会在代码里详细说明。
完整代码示例
package volumata.web.service; import org.apache.poi.ss.usermodel.*; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ExcelMaxCellRowHandler { public static void main(String[] args) { // 替换成你的Excel文件路径 String excelPath = "你的文件路径.xlsx"; try (FileInputStream fis = new FileInputStream(new File(excelPath)); Workbook workbook = WorkbookFactory.create(fis)) { // 获取第一个工作表,可根据需求改成getSheet("工作表名称") Sheet targetSheet = workbook.getSheetAt(0); int maxCellCount = 0; int maxRowIndex = -1; // POI中行索引从0开始 // 遍历所有行 for (Row row : targetSheet) { // 二选一:根据你的需求选择统计方式 // 方式1:统计实际存在的非空单元格(跳过中间空列) // int currentCellCount = row.getPhysicalNumberOfCells(); // 方式2:统计到最后一个单元格的总列数(包含中间空单元格) int currentCellCount = row.getLastCellNum(); // 空行的getLastCellNum会返回-1,需要跳过避免错误统计 if (currentCellCount > maxCellCount && currentCellCount != -1) { maxCellCount = currentCellCount; maxRowIndex = row.getRowNum(); } } if (maxRowIndex != -1) { // 转换为Excel界面显示的行号(从1开始) int displayRowNum = maxRowIndex + 1; System.out.printf("单元格数量最多的是第%d行,共有%d个单元格%n", displayRowNum, maxCellCount); } else { System.out.println("工作表中没有有效数据行"); } } catch (IOException e) { e.printStackTrace(); } } }
关键细节说明
- 两种统计方式的区别:
getPhysicalNumberOfCells():只统计该行中实际创建过的单元格(比如有值、设置过格式的单元格),中间的空白单元格不会被计入。getLastCellNum():返回该行最后一个单元格的列索引+1,相当于从第0列到最后一个单元格的总列数,即使中间有空白列也会算入总数。根据你的示例需求,这个方法更符合预期。
- 行号转换:Apache POI的行索引从0开始,而Excel界面显示的行号从1开始,所以最后要把索引值+1转换成用户熟悉的行号。
- 资源管理:用try-with-resources语法自动关闭文件流和Workbook对象,避免资源泄漏。
- 空行处理:空行的
getLastCellNum()会返回-1,必须加判断跳过,不然会干扰统计结果。
测试你的示例场景
如果你的Excel文件中第3行(对应POI的行索引2)的getLastCellNum()返回7,运行代码后会输出:
单元格数量最多的是第3行,共有7个单元格
内容的提问来源于stack exchange,提问作者ramkumar govindhaswamy




