如何通过Interop Excel获取仅包含已填充行的单元格区域?
解决Interop Excel读取时包含大量空行的问题
为什么你的删除空行代码没生效?
从前往后遍历删除行时,删除某一行后,后续行会上移填补空缺,导致循环会跳过下一行。比如删除第100行后,原来的101行变成新的100行,但循环继续到101时,处理的是原来的102行,漏掉了原101行的空行判断。
方法1:修正删除空行的循环逻辑
改成从下往上遍历,删除行不会影响未处理的行,确保所有空行都被清理:
// 获取初始UsedRange的最后一行 int lastRow = excelRange.Rows.Count; // 从最后一行向上遍历 for (rowCnt = lastRow; rowCnt >= 2; rowCnt--) { var cellValue = (excelRange.Cells[rowCnt, 1] as Microsoft.Office.Interop.Excel.Range).Value2; if (cellValue == null || string.IsNullOrEmpty(cellValue.ToString())) { excelSheet.Cells[rowCnt, 1].EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp); } } // 清理后重新获取UsedRange,此时就是仅含数据的区域 excelRange = excelSheet.UsedRange;
方法2:直接获取非空行区域(无需修改原文件)
利用Excel的SpecialCells方法,直接筛选出有数据的单元格,再获取对应行范围:
try { // 筛选所有包含常量或公式的单元格(即有数据的单元格) Microsoft.Office.Interop.Excel.Range nonEmptyCells = excelSheet.Cells.SpecialCells( Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeConstants | Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeFormulas ); // 获取这些单元格所在的完整行区域 Microsoft.Office.Interop.Excel.Range nonEmptyRows = nonEmptyCells.EntireRow; // 后续直接遍历nonEmptyRows即可 } catch (System.Runtime.InteropServices.COMException) { // 处理工作表无数据的情况 }
方法3:定位最后一个有数据的行,截取有效区域
通过Find方法定位最后一个非空单元格,直接截取到该行的有效区域:
using System.Reflection; // 需要引入这个命名空间 // 从工作表右下角反向查找最后一个非空单元格 Microsoft.Office.Interop.Excel.Range lastCell = excelSheet.Cells.Find( "*", Missing.Value, Microsoft.Office.Interop.Excel.XlFindLookIn.xlValues, Microsoft.Office.Interop.Excel.XlLookAt.xlPart, Microsoft.Office.Interop.Excel.XlSearchOrder.xlByRows, Microsoft.Office.Interop.Excel.XlSearchDirection.xlPrevious, false, Missing.Value, Missing.Value ); if (lastCell != null) { int lastDataRow = lastCell.Row; // 获取从第2行到最后一个数据行的完整区域 Microsoft.Office.Interop.Excel.Range validRange = excelSheet.Range[ excelSheet.Cells[2, 1], excelSheet.Cells[lastDataRow, excelRange.Columns.Count] ]; // 后续遍历validRange即可 }
内容的提问来源于stack exchange,提问作者NadiaBallshek
相关产品推荐
相关产品推荐

