如何通过Interop正确遍历Excel表格特定行并解决相关异常
问题与解决方案
问题描述
我在编写读取Excel数据并将单元格值存入List的程序时遇到两个问题:
- UsedRange会选中工作表所有单元格,导致获取的数据超出需求
- 指定范围为
["A:A", Type.Missing]时触发异常:
System.ArgumentException: "HRESULT: 0x80070057 (E_INVALIDARG))"
我需要获取最后已使用行,因此使用了UsedRange,也尝试过指定特定范围及参考相关技术文章,但均未解决问题。当前代码如下:
foreach (Excel.Range row in usedRange) { for(int i=0; i<lastCell.Row; i++) { if (row.Cells[4, i + 1].Value2 != null) { personlist.Add(Convert.ToString(row.Cells[4, i + 1].Value2)); } else { i++; } } foreach(var person in personlist) { Console.WriteLine(person); } }
解决方案
1. 解决UsedRange范围过大的问题
UsedRange会包含所有曾经编辑过的单元格(哪怕内容已删除),要精准获取当前有数据的最后行,用以下方法:
// 获取工作表中最后一个有数据的行号 int lastUsedRow = worksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; // 获取实际有数据的范围(示例为A1到第lastUsedRow行的第4列) Excel.Range targetRange = worksheet.Range["A1", $"D{lastUsedRow}"];
如果只需要某一列(比如第4列)的数据,可直接指定列范围:
Excel.Range targetColumn = worksheet.Range["D1", $"D{lastUsedRow}"];
2. 解决整列范围触发异常的问题
直接用"A:A"指定整列时,要使用Office Interop的正确调用方式:
// 获取A列整列 Excel.Range columnARange = worksheet.Columns["A:A"]; // 或者用列索引 Excel.Range columnARange = worksheet.Columns[1];
如果只需要A列的已使用部分,结合前面的lastUsedRow:
Excel.Range usedColumnA = worksheet.Range["A1", $"A{lastUsedRow}"];
修正后的完整代码
List<string> personlist = new List<string>(); // 假设worksheet是已打开的目标Excel工作表 int lastUsedRow = worksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell).Row; // 取第4列(D列)的已使用数据 Excel.Range targetColumn = worksheet.Range["D1", $"D{lastUsedRow}"]; foreach (Excel.Range cell in targetColumn) { if (cell.Value2 != null) { personlist.Add(Convert.ToString(cell.Value2)); } } // 输出结果 foreach (var person in personlist) { Console.WriteLine(person); }
内容的提问来源于stack exchange,提问作者TDC_404
相关产品推荐
相关产品推荐

