我正在使用epplus读取excel文件,我想循环遍历每一行和每一列,并查找列标题以检查集合并读取匹配的单元格值。我是epplus的新手,找不到任何像这样的东西的参考。我在this link中查看了类似的问题,但是我没有循环列标题的东西。
有可能这样做吗?非常感谢任何帮助。
谢谢!
答案 0 :(得分:2)
如果要在Excel文件中找到与您指定的名称相匹配的列,可以使用此功能:
public string FindColumnAddress(ExcelWorksheet sheet, string columnName)
{
int totalRows = sheet.Dimension.End.Row;
int totalCols = sheet.Dimension.End.Column;
var range = sheet.Cells[1, 1, 1, totalCols];
for (int i = 1; i <= totalCols; i++)
{
if (range[1, i].Address != "" && range[1, i].Value != null && range[1, i].Value.ToString() == columnName)
return range[1, i].Address;
}
return null;
}
它将返回列标题的地址。 您可以将其更改为将i作为列的索引返回。
答案 1 :(得分:1)
或者如果您更喜欢使用Linq的解决方案:
/// <summary>
/// Get 1 based column number of first column with 'columnName' as column header
/// </summary>
/// <param name="sheet"></param>
/// <param name="columnName">Column name to find</param>
/// <returns>1 based column number if found or null if column not found</returns>
public int? FindColumnAddress(ExcelWorksheet sheet, string columnName)
{
int totalCols = sheet.Dimension.End.Column;
var header = sheet.Cells[1, 1, 1, totalCols].ToList();
var idx = header.IndexOf(header.FirstOrDefault(hdritm => hdritm.Text == columnName));
return idx < 0 ? (int?)null : idx + 1;
}
注意:如果要检索多个列标题位置,则可能需要生成“标题”列表,然后使用Linq查询检索每个列号,而无需重建列表每次搜索。
我在这里找到了使用IndexOf的建议: