C#如何根据Excel列头名称动态识别对应列的索引
C# 动态匹配Excel列索引解决方案
该需求可直接通过遍历列头行单元格匹配列名实现,以下为补全后的代码示例(基于EPPlus库):
using OfficeOpenXml; using System.IO; using System.Linq; string folderPath = @"C:\Test"; string file = Path.Combine(folderPath, @"OrderData.xlsx"); // EPPlus 5+版本需要指定非商业使用许可,低于5.x版本可删除下行 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (var excel = new ExcelPackage(new FileInfo(file))) { ExcelWorksheet worksheet = excel.Workbook.Worksheets.FirstOrDefault(x => x.Name == "Orders"); // 工作表不存在时提前抛出异常避免空引用 if (worksheet == null) { throw new FileNotFoundException("未找到名为Orders的工作表"); } int excelRowNumber = 4; // 你需要更新数据的行号 string columnName = "OrderID"; // 假设列头存储在第1行,可根据实际业务调整行号 int headerRow = 1; // 遍历列头行所有已使用列,匹配列名获取索引,忽略大小写匹配,不需要可删除StringComparison参数 int columnIndex = Enumerable.Range(1, worksheet.Dimension.End.Column) .FirstOrDefault(col => string.Equals(worksheet.Cells[headerRow, col].Text?.Trim(), columnName, StringComparison.OrdinalIgnoreCase)); // 未找到匹配列时抛出异常 if (columnIndex == 0) { throw new KeyNotFoundException($"工作表中未找到名为{columnName}的列"); } worksheet.Cells[excelRowNumber, columnIndex].Value = "ABCD"; excel.Save(); }
注意事项
- 如果你实际的列头不是存储在第1行,修改
headerRow的数值即可 - 代码中使用了忽略大小写的匹配规则,需要严格区分大小写匹配的话,直接用
worksheet.Cells[headerRow, col].Text?.Trim() == columnName判断即可 - EPPlus 5及以上版本需要显式指定许可上下文,低于5.x的版本可以删除
ExcelPackage.LicenseContext相关代码 - 拼接文件路径推荐使用
Path.Combine避免不同系统的路径分隔符兼容问题
内容的提问来源于stack exchange,提问作者Aravindharaj Selvaraju
相关产品推荐
相关产品推荐

