J'ai une feuille Excel créée dynamiquement, je voudrais formater certaines colonnes comme date, mais je ne connais pas à l'avance l'index de ces colonnes, je ne connais que le titre de l'en-tête.
1- Je charge Excel depuis DataTable
var templateXls = new ExcelPackage();
var sheet = templateXls.Workbook.Worksheets.Add(parameters.ReportName);
sheet.Cells["A1"].LoadFromDataTable(myDataTable, true);
Maintenant, comment puis-je formater par exemple une colonne avec le nom "Date de naissance" pour être un champ de date courte? la colonne peut être dans n'importe quel index dépend de la sélection de l'utilisateur, il est également possible que la colonne ne soit pas générée. (si l'utilisateur ne l'inclut pas)
Peut aussi le faire avec un peu de linq
. Donc, basé sur votre extrait de code (vous pouvez ajouter des vérifications de référence nulle):
var idx = sheet
.Cells["1:1"]
.First(c => c.Value.ToString() == "Birthdate")
.Start
.Column;
sheet.Column(idx).Style.Numberformat.Format = "mm-dd-yy";
Vous pouvez également utiliser la méthode d'extension comme ceci:
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;
}
}
et l'utiliser:
int columnId = ws.GetColumnByName("Birthdate");
Vous pouvez extraire les valeurs des cellules de la première ligne de cette façon:
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
}
}
}
Ensuite, vous pouvez procéder à leur comparaison en fonction de vos intérêts.
Gardez à l'esprit que contrairement aux listes et aux tableaux, les index des lignes et des colonnes commencent à "1" au lieu de "0"