You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:50:14