web-dev-qa-db-fra.com

Colonne Excel Date renvoyant INT à l'aide d'EPPlus

J'utilise donc EPPlus pour lire et écrire des documents Excel.

Workflow

  • L'utilisateur génère un document Excel rempli
  • Ouvre le document et ajoute une ligne
  • Téléchargé et lu

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

26
Tsukasa

... 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 
37
Tim Schmelter

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.Formaten conséquence.

J'ai publié l'exemple de code complet (fichier DataTable vers Excel avec EPPlus) dans cet article sur mon blog .

1
Darkseal