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

WinForms中如何读取Excel表格的指定列数据?

解决方案

核心思路是先一次性映射指定表头与Excel列索引,后续遍历数据行时直接通过映射关系提取对应列的值,避免重复判断表头,同时保证列对应关系准确。

步骤说明

  1. 遍历表头行,把需要的列(ID、COLOR等)对应的Excel列索引存入字典,建立「列名→列索引」的映射
  2. 遍历数据行时,根据字典里的映射,直接读取对应列的单元格值,填充到DataRow的对应列中

修改后的完整代码

// 指定需要提取的列名
public string[] bomArr = { "ID", "COLOR", "DESCRIPTION", "SUPPLIER", "COST" };
int fabricHeaderRow = findFabricHeader(excelRange); // 表头行号,示例返回26
int rows = excelRange.Rows.Count;
int cols = excelRange.Columns.Count;

// 第一步:建立表头列名到Excel列索引的映射字典
Dictionary<string, int> columnMap = new Dictionary<string, int>();
for (int j = 1; j <= cols; j++)
{
    var headerValue = excelRange.Cells[fabricHeaderRow, j].Value2?.ToString().Trim();
    // 若当前表头是目标列,记录对应列索引
    if (!string.IsNullOrEmpty(headerValue) && bomArr.Contains(headerValue))
    {
        columnMap[headerValue] = j;
    }
}

// 第二步:遍历数据行,提取指定列数据
for (int i = fabricHeaderRow + 1; i <= rows; i++) // 表头行下一行开始为数据行,可根据实际情况调整+1/+2
{
    // 第一列为空则终止遍历
    if (excelRange.Cells[i, 1].Value2 == null)
    {
        break;
    }

    myNewRow3 = bomTable.NewRow();

    // 遍历目标列,通过映射读取对应单元格值
    foreach (var columnName in bomArr)
    {
        if (columnMap.TryGetValue(columnName, out int colIndex))
        {
            // 处理空单元格,为空则填空字符串
            var cellValue = excelRange.Cells[i, colIndex].Value2;
            myNewRow3[columnName] = cellValue?.ToString() ?? string.Empty;
        }
        else
        {
            // Excel中无此列时,填空字符串
            myNewRow3[columnName] = string.Empty;
        }
    }

    bomTable.Rows.Add(myNewRow3);
}

关键改进点

  • 仅初始化时做一次表头映射,避免重复判断,提升效率
  • 通过列名匹配DataRow列,不会因Excel列顺序变化导致数据错位
  • 兼容Excel缺失指定列的情况,避免报错
  • 统一处理空单元格,确保DataRow无null值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:01:08