You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动