Epplus konvertiert Excel -Tabellenkalkulationsspalte in einen zufälligen negativen Wert

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

  •  27-10-2019
  •  | 
  •  

Frage

Ich habe eine C# -Methode, siehe Code unten, die eine Excel -Tabelle mit EPPLUS generiert. Die Methode nimmt in 3 Zeichenfolgen auf, von denen eine von einer Rohrgremed -Zeichenfolge namens CSV ist, die meine Daten enthält. Die von mir verwendeten Daten haben 14 Spalten, und in der 14. Spalte habe ich Daten, die aussehen: 103.01.06 oder 01.01 oder einige andere numerische Werte, die durch Perioden getrennt sind. Das Problem, das ich sehe, ist, dass Epplus diesen in den Wert -656334 verwandelt, wenn der Wert 103.01.06 beträgt. Gibt es eine Möglichkeit, dies zu beheben?

    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();
        }
    }
War es hilfreich?

Lösung

Wenn Sie keinen Spalten -Typ über die DataTypes -Eigenschaft des Spalten angeben ExcelTextFormat Objekt dann nimmt EPPLUS für die Spalte unbekannt an. Da Sie vierzehn Spalten haben und in der Vierzehnten Spalte Probleme mit Daten haben, müssen Sie für jede vorherige Spalte Typen angeben. Ohne Ihre Datenatypen zu kennen, habe ich gerade vierzehn Fälle von aufgeführt eDataTypes.String, aber eDataTypes.Number usw. würde auch funktionieren.

Epplus rate rät, wenn er einer Spalte einen Typ zugewiesen hat.

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();
    }
}

Andere Tipps

Es scheint interpretiert zu werden als DateTime, Vielleicht ein Fehler.

Versuche dies:

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 = "@";

Wenn das nicht funktioniert, versuchen Sie, das Format vor Ihnen festzulegen LoadFromText Der CSV.

Zum Beispiel:

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);

Hinweis: Sie müssen für jede Spalte einen Datentyp bereitstellen. Aber ich habe es mit getestet null, scheinen zu funktionieren, wenn Sie den Typ nicht angeben möchten. Wenn es nicht kompiliert wird, können Sie sich nicht ändern (manuell konvertiert von VB.NET).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top