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

如何使用EPPlus ExcelPackage基于动态列读取Excel单元格值?

问题描述

我目前使用EPPlus的ExcelPackage读取Excel表格,原有代码是通过指定行号和列号读取单元格值并赋值给DataTable的新行(代码如下)。但现在Excel表头是动态的,列顺序可任意调整,请问该如何基于动态列读取对应值?

原有代码示例:

var newRow = table.NewRow();
newRow["Reference"] = row[rowNumber, 1].Text;
newRow["AssessmentTitle"] = row[rowNumber, 2].Text;
newRow["AssessmentDate"] = row[rowNumber, 3].Text;
newRow["AssessmentLabel"] = row[rowNumber, 4].Text;
newRow["Likelihood"] = row[rowNumber, 5].Text;
newRow["Impact"] = row[rowNumber, 6].Text;
解决方案

核心思路是先解析表头行,建立「表头文本→列索引」的映射关系,后续读取数据行时,根据DataTable的列名去映射表里找对应的Excel列索引,再读取单元格值。具体实现步骤如下:

  1. 读取表头并构建映射字典
    先获取Excel的表头行(默认取第1行,可根据实际调整),遍历每个单元格,把表头文本和对应的列索引存入字典,方便后续快速查找。

  2. 遍历数据行,按映射关系赋值
    对每一行数据,不再硬编码列号,而是通过DataTable的列名去字典中匹配对应的Excel列索引,找到后读取单元格值并赋值给DataTable新行。

修改后的代码示例:

// 1. 读取表头行,构建表头文本与列索引的映射(假设表头在第1行)
var headerRow = worksheet.Cells[1, 1, 1, worksheet.Dimension.End.Column];
// 忽略大小写,兼容表头文本大小写不一致的场景
var headerMapping = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

foreach (var cell in headerRow)
{
    if (!string.IsNullOrWhiteSpace(cell.Text))
    {
        headerMapping[cell.Text] = cell.Start.Column;
    }
}

// 2. 遍历数据行(从第2行开始,跳过表头行)
for (int rowNumber = 2; rowNumber <= worksheet.Dimension.End.Row; rowNumber++)
{
    var newRow = table.NewRow();
    
    // 遍历DataTable的每一列,通过映射查找对应Excel列
    foreach (DataColumn column in table.Columns)
    {
        if (headerMapping.TryGetValue(column.ColumnName, out int excelColumnIndex))
        {
            newRow[column.ColumnName] = worksheet.Cells[rowNumber, excelColumnIndex].Text;
        }
        else
        {
            // Excel中无对应列时,设为空值或DBNull,按需调整
            newRow[column.ColumnName] = DBNull.Value;
        }
    }
    
    table.Rows.Add(newRow);
}

额外提示

  • 若Excel表头存在重复文本,需提前处理重复项,避免字典键冲突。
  • 表头行位置不是第1行时,修改headerRow的行号参数即可。
  • 可根据需求扩展单元格值的类型转换逻辑(比如日期、数字类型的处理)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:30:27