Epplus 使用列名查找列

Epplus find column using column name

我动态创建了 excel sheet,我想将一些列格式化为日期,但是我事先不知道这些列的索引,我只知道 header 标题.

1- 我从 DataTable

加载 excel
var templateXls = new ExcelPackage();
        var sheet = templateXls.Workbook.Worksheets.Add(parameters.ReportName);

        sheet.Cells["A1"].LoadFromDataTable(myDataTable, true);

现在如何将名称为 "Birthdate" 的列格式化为 short-date 字段?该列可以在任何索引中,具体取决于用户的选择,也有可能不会生成该列。 (如果用户不包含它)

您可以这样提取第一行中单元格的值:

        using (ExcelPackage package = new ExcelPackage(new FileInfo(filePath)))
        {
            foreach (ExcelWorksheet worksheet in package.Workbook.Worksheets)
            {
                List<string> ColumnNames = new List<string>();
                for(int i = 1; i <= worksheet.Dimension.End.Column; i++)
                {
                    ColumnNames.Add(worksheet.Cells[1, i].Value.ToString()); // 1 = First Row, i = Column Number
                }
            }
        }

那你就可以根据自己的兴趣进行比较了。

请记住,与列表和数组不同,行和列的索引从“1”而不是“0”开始

稍微 linq 也可以做到。因此,基于您的代码片段(可能需要添加一些空引用检查):

var idx = sheet
    .Cells["1:1"]
    .First(c => c.Value.ToString() == "Birthdate")
    .Start
    .Column;

sheet.Column(idx).Style.Numberformat.Format = "mm-dd-yy";

您也可以像这样使用扩展方法:

public static class EpPlusExtensionMethods
{
    public static int GetColumnByName(this ExcelWorksheet ws, string columnName)
    {
        if (ws == null) throw new ArgumentNullException(nameof(ws));
        return ws.Cells["1:1"].First(c => c.Value.ToString() == columnName).Start.Column;
    }
}

并使用它:

int columnId = ws.GetColumnByName("Birthdate");