Excelシートを動的に作成しました。いくつかの列を日付として書式設定したいのですが、これらの列のインデックスが事前にわからないので、ヘッダーのタイトルしかわかりません。
1-私はDataTableからExcelをロードします
var templateXls = new ExcelPackage();
var sheet = templateXls.Workbook.Worksheets.Add(parameters.ReportName);
sheet.Cells["A1"].LoadFromDataTable(myDataTable, true);
たとえば、「誕生日」という名前の列を短い日付フィールドにフォーマットするにはどうすればよいですか?列は、ユーザーの選択に応じて任意のインデックスに含めることができます。また、列が生成されない可能性もあります。 (ユーザーが含まない場合)
少しの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";
次のような拡張メソッドを使用することもできます。
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");
次の方法で、最初の行のセルの値を抽出できます。
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」から始まることに注意してください