web-dev-qa-db-ja.com

Epplusは列名を使用して列を検索します

Excelシートを動的に作成しました。いくつかの列を日付として書式設定したいのですが、これらの列のインデックスが事前にわからないので、ヘッダーのタイトルしかわかりません。

1-私はDataTableからExcelをロードします

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

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

たとえば、「誕生日」という名前の列を短い日付フィールドにフォーマットするにはどうすればよいですか?列は、ユーザーの選択に応じて任意のインデックスに含めることができます。また、列が生成されない可能性もあります。 (ユーザーが含まない場合)

12
Maro

少しのlinqでもできます。したがって、コードスニペットに基づいて(いくつかのnull参照チェックを追加したい場合があります):

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

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

次のような拡張メソッドを使用することもできます。

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");
12
Yehia Amer

次の方法で、最初の行のセルの値を抽出できます。

        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
                }
            }
        }

その後、興味に応じてそれらを比較することができます。

リストと配列とは異なり、行と列のインデックスは「0」ではなく「1」から始まることに注意してください

6
Innat3