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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:32:45