J'utilise donc EPPlus pour lire et écrire des documents Excel.
Workflow
Les dates générées lorsque je crée le document à l'aide d'EPPlus s'affichent correctement lorsque je relis la valeur, mais la ligne que l'utilisateur modifie la date ou ajoute s'affiche en tant que valeur INT et non quelque chose que je peux utiliser comme date réelle.
Lorsque j'entre la date 1/01/2014 et l'écris, la sortie lorsque j'ouvre le fichier montre 4164
Je le lis comme suit
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value != null
? sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Value.ToString().Trim()
: string.Empty
Mise à jour
Lors de l'exportation du fichier, j'ai ajouté ce qui suit
DateTime testDate;
if (DateTime.TryParse(split[i], out testDate))
{
sheet.Cells[row, i + 1].Style.Numberformat.Format = "MM/dd/yyyy";
sheet.Cells[row, i + 1].Value = testDate.ToString("MM/dd/yyyy");
}
Aussi lors de la lecture de la valeur, j'ai essayé
sheet.Cells[i, "AE".ConvertExcelColumnIndex()].Style.Numberformat.Format = "MM/dd/yyy";
Je reçois toujours un INT
... quand j'ai besoin de lire ce fichier Excel, les seules dates incorrectes sont celles que l'utilisateur a modifiées
Ainsi, lorsque vous lisez la feuille Excel modifiée, les dates modifiées sont des nombres tandis que les valeurs inchangées sont des chaînes dans votre format de date?
Vous pouvez obtenir le DateTime
via DateTime.FromOADate
:
long dateNum = long.Parse(worksheet.Cells[row, column].Value.ToString());
DateTime result = DateTime.FromOADate(dateNum);
Avec votre numéro d'échantillon:
Console.Write(DateTime.FromOADate(41640)); // -> 01/01/2014
Je suis tombé sur ce problème aujourd'hui en essayant de générer des documents Excel à partir de certains DataTables ASP.NET: je n'ai eu aucun problème avec les chaînes, mais j'ai rencontré quelques problèmes avec les types numériques (int, doubles, décimales) et DataTables, qui ont été formatés en chaîne ou sous forme de représentations numériques (OADate).
Voici la solution que j'ai finalement réussi à retirer:
if (dc.DataType == typeof(DateTime))
{
if (!r.IsNull(dc))
{
ws.SetValue(row, col, (DateTime)r[dc]);
// Change the following line if you need a different DateTime format
var dtFormat = "dd/MM/yyyy";
ws.Cells[row, col].Style.Numberformat.Format = dtFormat;
}
else ws.SetValue(row, col, null);
}
Apparemment, l'astuce consistait à définir la valeur comme DateTime
, puis à configurer la bonne Style.Numberformat.Format
en conséquence.
J'ai publié l'exemple de code complet (fichier DataTable vers Excel avec EPPlus) dans cet article sur mon blog .