You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Apache POI实现两个Excel表格逐行数据对比的咨询

逐行遍历表1并与全量表2对比的实现方案

现有代码问题

你现有代码的核心问题是num变量定义在循环外层,首次遍历完表2所有行之后num值就等于表2总行数,后续处理表1下一行时调用workbook2.getSheetAt(0).getRow(num++)会直接取到空行甚至抛出下标越界异常,完全不符合需求。

修正后可直接运行的代码

DataFormatter formatter = new DataFormatter();
// 提前提取两个sheet对象,避免重复调用提升性能
Sheet sheet1 = workbook.getSheetAt(0);
Sheet sheet2 = workbook2.getSheetAt(0);
int sheet1RowCount = sheet1.getPhysicalNumberOfRows();
int sheet2RowCount = sheet2.getPhysicalNumberOfRows();

// 外层循环遍历表1所有行,如需跳过表头将i初始值改为1即可
for (int i = 0; i < sheet1RowCount; i++) {
    String sheet1CurValue = formatter.formatCellValue(sheet1.getRow(i).getCell(1));
    // 每次处理表1新行时,都从第一行开始重新遍历全量表2
    for (int j = 0; j < sheet2RowCount; j++) {
        String sheet2CurValue = formatter.formatCellValue(sheet2.getRow(j).getCell(1));
        if (sheet1CurValue.contains(sheet2CurValue)) {
            System.out.println("Works " + sheet2CurValue);
        } else {
            System.out.println("No match");
        }
    }
}

逻辑说明

  • 外层循环负责表1的逐行遍历,每次进入外层循环即取表1的新行数据
  • 内层循环每次都会从表2首行开始全量遍历,完全满足「表1单条数据和表2全量数据对比完成后再处理表1下一行」的需求
  • 如果你的表1有表头需要跳过,仅需把外层循环的i初始值修改为1即可,对应你原有代码中从第二行(下标1)开始取数的逻辑

内容的提问来源于stack exchange,提问作者Jose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 23:24:03