使用Office Interop读取Excel数据时触发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

