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

使用Office Interop读取Excel数据时触发Index exceeds bounds错误排查

解决Excel Interop读取数据时的Index Exceeds Bounds错误

我一眼就看到代码里的几个关键问题,正是它们导致了索引越界错误,咱们一个个梳理:

  • 数组初始化逻辑完全错误
    你创建data数组时用了xlRange.Rows.Count - xlRange.Row和xlRange.Columns.Count - xlRange.Column,这完全搞错了数组长度的计算方式。xlRange.Rows.Count本身就是UsedRange的总行数,不管UsedRange从第几行开始,数组的行数就等于这个数值,列数同理。举个例子:如果UsedRange从第2行开始,一共3行,那数组行数应该是3,而不是3-2=1——这种错误的初始化直接让数组容量太小,循环写入时必然触发越界。

  • 循环边界的冗余计算容易出错
    你用lastRow - firstRow来计算循环上限,其实xlRange.Rows.Count - 1就等价于这个值,但核心问题还是数组长度不对,就算循环逻辑没问题,数组装不下数据也会报错。

  • Cells的索引访问方式错误
    你写的excelSheet.Cells[firstRow + i][firstColumn + j]是错误的二维访问方式,Cells本身支持直接的二维索引,正确写法应该是excelSheet.Cells[firstRow + i, firstColumn + j]。之前的写法相当于先获取firstRow+i整行的Range,再从里面取第firstColumn+j个元素,如果这个列数超过了该行的实际列数,也会触发越界。

另外,我还帮你加上了空值判断——Excel里空单元格的Value是null,直接转字符串会抛空引用异常,用?.和??可以优雅处理这种情况。

下面是修正后的完整代码:

public static string[,] ReadFromExcel(Worksheet excelSheet) 
{
    if (excelSheet == null) 
        return new string[1, 1];

    Microsoft.Office.Interop.Excel.Range xlRange = excelSheet.UsedRange;
    int rowCount = xlRange.Rows.Count;
    int columnCount = xlRange.Columns.Count;
    int firstRow = xlRange.Row;
    int firstColumn = xlRange.Column;

    // 直接用UsedRange的总行数、总列数初始化数组
    string[,] data = new string[rowCount, columnCount];

    for (int i = 0; i < rowCount; i++) 
    {
        for (int j = 0; j < columnCount; j++) 
        {
            // 正确的二维索引访问单元格
            Range cell = excelSheet.Cells[firstRow + i, firstColumn + j] as Range;
            // 处理空单元格,避免空引用异常
            data[i, j] = cell?.Value?.ToString() ?? string.Empty;
        }
    }
    return data;
}

内容的提问来源于stack exchange,提问作者Luki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:35:25