WinForms中如何读取Excel表格的指定列数据?
解决方案
核心思路是先一次性映射指定表头与Excel列索引,后续遍历数据行时直接通过映射关系提取对应列的值,避免重复判断表头,同时保证列对应关系准确。
步骤说明
- 遍历表头行,把需要的列(ID、COLOR等)对应的Excel列索引存入字典,建立「列名→列索引」的映射
- 遍历数据行时,根据字典里的映射,直接读取对应列的单元格值,填充到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
相关产品推荐
相关产品推荐

