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

使用EPPlus删除Excel重复行时删除结果错误如何修复?

错误原因

你现有代码的核心问题有两个:

  1. 行号错位:你收集的待删除行号是从小到大排序的,正序删除时,每删掉一行,下方所有行的行号都会自动减1,后续你按原来记录的行号删除,就会删错位置。
  2. 缺少边界校验:while循环没有限制i的最大值,当遍历到最后一行时,i会超出工作表的最大行范围,访问不存在的单元格调用ToString()会直接抛出空引用异常。另外你代码里的rowsToDelete.add小写的add属于语法错误,C#里List的添加方法是大写开头的Add。
修复后代码
List<int> rowsToDelete = new List<int>();
int maxRow = worksheet.Dimension.End.Row;
for (int row = 1; row <= maxRow; row++)
{
    // 跳过已经标记为要删除的行
    if (rowsToDelete.Contains(row)) continue;
    
    // 增加空值判断,避免空单元格报错
    string a = worksheet.Cells[row, 1].Value?.ToString() ?? string.Empty;
    string b = worksheet.Cells[row, 2].Value?.ToString() ?? string.Empty;
    string c = worksheet.Cells[row, 3].Value?.ToString() ?? string.Empty;

    int i = row + 1;
    // 增加边界判断,避免超出最大行
    while (i <= maxRow 
           && worksheet.Cells[i, 1].Value?.ToString()?.Equals(a) == true 
           && worksheet.Cells[i, 2].Value?.ToString()?.Equals(b) == true
           && worksheet.Cells[i, 3].Value?.ToString()?.Equals(c) == true)
    {
        rowsToDelete.Add(i);
        i++;
    }
}
// 倒序删除,从最大的行号开始删,避免行号错位
foreach (var row in rowsToDelete.OrderByDescending(r => r))
{
    worksheet.DeleteRow(row);
}
补充说明
  • 倒序删除是核心修复点,删除行号更大的行不会影响行号更小的行的编号,完全不会出现删错的情况。
  • 新增的空值判断可以处理单元格没有内容的场景,避免运行时报错。
  • 如果你的重复行判断逻辑需要包含更多列,只需要在while的判断条件里对应增加列的对比规则即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:24:02