C# WinForm中Excel AutoFilter遍历异常问题求助
问题分析
你的代码存在三个核心问题,导致一直重复生成首个客户的工作表:
- 筛选条件未动态变更:循环里始终用
machine2.Value,这是整个AA2:AA{lastRow4}范围的默认值(即首个单元格内容),完全没用到当前循环的facility项。 - 筛选列索引错误:AA列对应Excel的第27列(A=1,AA=27),但你用
3作为AutoFilter的列参数,实际在筛选C列,逻辑完全偏离需求。 - 未处理重复标识:AA列存在重复客户标识时,会重复创建相同数据的工作表,极端情况下会导致无限循环。
修正方案
- 提取唯一客户标识:先收集AA列所有非空值并去重,避免重复处理相同客户。
- 修正筛选逻辑:用AA列的正确索引
27,循环时取当前唯一标识作为筛选条件。 - 规范循环项取值:遍历Range时,每个
facility是单个单元格对象,需取Value2(比Value更稳定)作为筛选值。 - 清理自动筛选:每次操作后关闭自动筛选,避免影响后续执行。
完整修正代码
// 获取AA列最后一行(优化写法,避免全列计数的冗余) int lastRow4 = newerWSCopy.Cells[newerWSCopy.Rows.Count, "AA"].End(Excel.XlDirection.xlUp).Row; // 提取AA列第2行到最后一行的非空唯一值 var uniqueFacilities = newerWSCopy.Range["AA2:AA" + lastRow4] .Cast<Excel.Range>() .Where(r => r.Value2 != null) .Select(r => r.Value2.ToString()) .Distinct() .ToList(); // 遍历每个唯一客户标识 foreach (var facility in uniqueFacilities) { // 关闭之前的自动筛选(如果存在) if (newerWSCopy.AutoFilterMode) newerWSCopy.AutoFilterMode = false; // 对AA列(第27列)筛选当前客户标识 newerWSCopy.Range["A1:I" + lastRow4].AutoFilter(Field: 27, Criteria1: facility); // 复制可见单元格区域 newerWSCopy.AutoFilter.Range.SpecialCells(Excel.XlCellType.xlCellTypeVisible).Copy(); // 创建新工作表并粘贴,给工作表命名为客户标识方便识别 Excel.Worksheet newWS = xlApp2.Worksheets.Add(After: xlWorkbook2.Sheets[xlWorkbook2.Sheets.Count]); newWS.Name = facility; newWS.Paste(); newWS.AutoFilterMode = false; // 清除剪贴板,释放资源 xlApp2.CutCopyMode = false; } // 最后关闭原工作表的自动筛选 if (newerWSCopy.AutoFilterMode) newerWSCopy.AutoFilterMode = false;
额外优化建议
- 如果客户标识是数字类型,去掉
ToString(),直接用r.Value2即可。 - 大数据量操作时,建议关闭Excel的屏幕更新和事件,提升运行速度:
xlApp2.ScreenUpdating = false; xlApp2.EnableEvents = false; // 执行核心代码后恢复 xlApp2.ScreenUpdating = true; xlApp2.EnableEvents = true; - 操作完成后务必释放所有Excel对象(Range、Worksheet、Workbook、Application),避免进程残留。
内容的提问来源于stack exchange,提问作者asmcrae1997
相关产品推荐
相关产品推荐

