EPPlus convertit la colonne de feuille de calcul Excel à la valeur négative aléatoire

StackOverflow https://stackoverflow.com/questions/8358966

  •  27-10-2019
  •  | 
  •  

Question

J'ai une méthode C #, voir le code ci-dessous, qui génère une feuille de calcul Excel à l'aide EPPlus. Le procédé prend en 3 cordes, dont l'un est un tube nommé chaîne délimitée csv qui a mes données en elle. Les données que je utilise a 14 colonnes, et dans la 14e colonne I avoir des données qui ressemble à: 103.01.06 ou 01.01, ou d'autres valeurs numériques séparées par des périodes. Le problème que je vois est que si la valeur est 103.01.06, puis transforme EPPlus que dans la valeur -656334. Y at-il un moyen de résoudre ce problème?

    private void GenerateSpreadsheet(string id, string csv, string worksheetName)
    {
        using (ExcelPackage pck = new ExcelPackage())
        {
            ExcelWorksheet ws = pck.Workbook.Worksheets.Add(worksheetName);

            ws.Cells["A1"].LoadFromText(csv, new ExcelTextFormat{Delimiter = '|'}); 

            Response.AddHeader("Content-Disposition",
                String.Format("attachment; filename={0}.xlsx", id));
            Response.ContentType =
                "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
            Response.BinaryWrite(pck.GetAsByteArray());
            Response.End();
        }
    }
Était-ce utile?

La solution

Si vous ne spécifiez pas de type colonnes via la propriété Datatypes de l'objet ExcelTextFormat alors EPPlus suppose inconnue pour la colonne. Puisque vous avez quatorze colonnes et que vous rencontrez des problèmes avec les données de la quatorzième colonne vous devrez spécifier les types pour chaque colonne avant. Sans connaître vos types de données que je viens d'énumérer quatorze cas de eDataTypes.String, mais eDataTypes.Number etc. travailleraient aussi.

EPPlus fait une estimation lors de l'attribution d'un type à une colonne.

private void GenerateSpreadsheet(string id, string csv, string worksheetName)
{
    using (ExcelPackage pck = new ExcelPackage())
    {
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add(worksheetName);

        ws.Cells["A1"].LoadFromText(csv, new ExcelTextFormat { Delimiter = '|', 
            DataTypes = new eDataTypes[] { eDataTypes.String, eDataTypes.String, 
                eDataTypes.String, eDataTypes.String, eDataTypes.String,
                eDataTypes.String, eDataTypes.String, eDataTypes.String,
                eDataTypes.String, eDataTypes.String, eDataTypes.String, 
                eDataTypes.String, eDataTypes.String, eDataTypes.String } }); 

        Response.AddHeader("Content-Disposition",
            String.Format("attachment; filename={0}.xlsx", id));
        Response.ContentType =
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
        Response.BinaryWrite(pck.GetAsByteArray());
        Response.End();
    }
}

Autres conseils

Il semble être interprété comme DateTime, peut-être un bug.

Essayez ceci:

var format = New ExcelTextFormat()
format.Delimiter = '|';
ws.Cells("A1").LoadFromText(csv, format);
var colNumber = 14;
var colRange = ws.Cells(1, colNumber, ws.Dimension.End.Row, colNumber);
colRange.Style.Numberformat.Format = "@";

Si cela ne fonctionne pas, essayez de définir le format avant LoadFromText CSV.

Par exemple:

var csv = IO.File.ReadAllText(csvPath);
var ws = pck.Workbook.Worksheets.Add("Test");
var format As New ExcelTextFormat();
format.Delimiter = '|';
// if columns 4 shall not be interpreted like a DateTime 
format.DataTypes = {
    null,
    null,
    null,
    eDataTypes.String
};
var range = ws.Cells("A1").LoadFromText(csv, format);

Note: Vous devez fournir un type de données pour chaque colonne. Mais je l'ai testé avec null, semblent fonctionner si vous ne voulez pas préciser le type. Si elle ne compile pas, ne hésitez pas à changer (converti manuellement à partir VB.NET).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top