使用EPPlus删除Excel重复行时删除结果错误如何修复?
错误原因
你现有代码的核心问题有两个:
- 行号错位:你收集的待删除行号是从小到大排序的,正序删除时,每删掉一行,下方所有行的行号都会自动减1,后续你按原来记录的行号删除,就会删错位置。
- 缺少边界校验: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
相关产品推荐
相关产品推荐

