C#中如何遍历Office.Interop.Excel自动筛选后的结果行?
遍历Excel自动筛选后可见行的C#实现
要遍历AutoFilter筛选后的可见行,核心是利用Excel Interop的SpecialCells方法获取所有可见单元格区域,再逐一处理这些区域内的行。需要注意的是,筛选后的结果可能由多个不连续的单元格区域组成,因此要循环处理每个区域。
完整实现代码
在你已有的筛选代码之后,添加以下遍历逻辑:
// 获取筛选后的可见单元格区域(包含表头) Range visibleRange = excelWorksheet.UsedRange.SpecialCells(XlCellType.xlCellTypeVisible); // 遍历每个不连续的可见区域 foreach (Range area in visibleRange.Areas) { // 遍历区域内的行,从区域起始行开始 for (int row = area.Row; row <= area.Row + area.Rows.Count - 1; row++) { // 跳过表头行(如果你的表头在第1行) if (row == 1) continue; // 示例:获取当前行G列(零件编号)和D列(日期)的值 string partNumber = excelWorksheet.Cells[row, 7].Value?.ToString(); DateTime? dateValue = excelWorksheet.Cells[row, 4].Value as DateTime?; // 这里添加你的业务处理逻辑 Console.WriteLine($"行号:{row},零件编号:{partNumber},日期:{dateValue?.ToString("yyyy-MM-dd")}"); } }
关键说明
SpecialCells(XlCellType.xlCellTypeVisible):精准定位筛选后的所有可见单元格,返回包含多个连续区域的Range集合。visibleRange.Areas:处理筛选后可能存在的不连续区域(比如中间有隐藏行导致区域拆分),确保每一块可见区域都被遍历到。- 跳过表头:根据你的表头位置调整判断逻辑,避免处理表头数据。
- 单元格取值:使用
?.ToString()和类型转换避免空引用异常,因为筛选后的单元格可能为空。
注意事项
- 确保Excel对象在使用后正确释放,避免内存泄漏。
- 若数据量较大(比如935行),这种遍历方式效率足够;如需更高效处理,可考虑将可见区域数据一次性读取到数组中再操作。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

