C#类实现Excel读写:求实现数据读取至多维数组的方法
实现Excel数据读取至多维数组的C#方法
刚好你已经有了写入多维数组的方法,咱们来实现对应的读取功能,完美适配你需要的double、int、string类型。核心思路是先读取Excel指定范围的原始数据(返回object[,]),再将其转换为你需要的泛型多维数组,同时处理空单元格的情况。
完整读取方法代码
using Microsoft.Office.Interop.Excel; using System; public T[,] ReadMultiCellValues<T>(int startRow, int startColumn, int rowCount, int columnCount) { if (rowCount <= 0 || columnCount <= 0) throw new ArgumentException("行数和列数必须大于0"); // 计算读取范围的结束行列 int endRow = startRow + rowCount - 1; int endColumn = startColumn + columnCount - 1; // 获取目标范围的Range对象 Range readRange = _worksheet.Range[_worksheet.Cells[startRow, startColumn], _worksheet.Cells[endRow, endColumn]]; // 读取原始数据(Value2比Value更高效,避免自动格式化) object[,] rawValues = readRange.Value2 as object[,]; if (rawValues == null) { // 如果范围是空的,返回空数组或者初始化默认值数组 return new T[rowCount, columnCount]; } // 初始化目标泛型数组 T[,] result = new T[rowCount, columnCount]; // 遍历转换每个元素 for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { object cellValue = rawValues[i + 1, j + 1]; // Excel的Range索引从1开始 // 处理空单元格(DBNull.Value或者null) if (cellValue == null || cellValue == DBNull.Value) { result[i, j] = default(T); continue; } // 尝试转换为目标类型 try { result[i, j] = (T)Convert.ChangeType(cellValue, typeof(T)); } catch (InvalidCastException) { throw new InvalidCastException($"无法将单元格({startRow+i}, {startColumn+j})的值'{cellValue}'转换为类型{typeof(T).Name}"); } } } return result; }
关键细节说明
- 范围计算:通过起始行列+行数/列数计算结束位置,确保读取的范围和你写入时的区域完全对应
- Value2的使用:优先用
Value2而不是Value,因为它直接返回单元格的原始数据,不会自动转换为格式化字符串(比如日期转成带格式的文本),效率更高也更准确 - 空单元格处理:Excel的空单元格会返回
DBNull.Value,这里统一转换为目标类型的默认值(比如int默认0,string默认null,你可以根据需求改成空字符串"") - 类型转换容错:添加了try-catch捕获转换失败的情况,抛出明确的异常信息,方便你快速定位问题
示例用法
// 读取从第2行第1列开始的3行2列int数据 int[,] intData = ReadMultiCellValues<int>(2, 1, 3, 2); // 读取从第1行第3列开始的5行4列double数据 double[,] doubleData = ReadMultiCellValues<double>(1, 3, 5, 4); // 读取从第1行第1列开始的10行10列string数据 string[,] stringData = ReadMultiCellValues<string>(1, 1, 10, 10);
额外注意事项
- 确保你的
_worksheet对象已经正确初始化(和写入方法共用的工作表实例) - 如果需要读取整个已使用数据区域(比如从起始单元格到最后有数据的单元格),可以扩展方法:先通过
_worksheet.UsedRange获取已使用区域,再自动计算行数和列数 - 记得在操作完Excel后及时释放COM对象,避免内存泄漏(比如调用
Marshal.ReleaseComObject处理Range、Worksheet等对象)
内容的提问来源于stack exchange,提问作者adamj537
相关产品推荐
相关产品推荐

