2016-11-01 8 views
0

Ich verwende EPPlus, um Daten zu lesen. Diese Daten bestehen entweder aus .xlsx oder .csv.CSV mit EPPlus Parsing-Problemen

Wenn die Datei eine .csv Datei ist, verwende ich die LoadFromText Funktionalität. Aber EPPlus entscheidet, dass es auch alle Werte parsen muss, die es nicht sollte.

Zum Beispiel:

Id;Double; 
1;-3,88; 

ExcelTextFormat format = new ExcelTextFormat(); 
format.Delimiter = ';'; 
worksheet.Cells[1, 1].LoadFromText("file", format); 

Ergebnis ist, dass der -3,88 Wert wird: -388 in dem Arbeitsblatt. Das habe ich herausgefunden, weil EPPlus das -3,88 als Zahl sieht und es als eine Zahl analysiert, wobei die Standardkultur InvariantCulture ist, was in diesem Fall (ähnlich) us-US ist.

Wie kann ich erreichen, dass EPPlus die CSV ohne Parsing lädt? (Nimmt alle Werte als Zeichenfolgen)

+0

Sie müssen nur die Kultur etwas "lokaler" setzen. Sehen Sie dieses für mehr Info: http://stackoverflow.com/questions/36927002/epplus-converting-csv-and-missing-the-comma-from-a-double/36938148#36938148 – Ernie

+0

Dann werde ich das Format bekommen, das ich brauche diese Kultur ja, aber ich brauche die Zeichenfolge, da sie für mehrere Kulturen in der Codebasis verwendet wird. –

+0

Versuchen Sie, das Spaltenformat vor dem Import auf Text zu setzen: 'worksheet.Cells [" A: A "]. Style.Numberformat.Format =" @ ";' – Magnetron

Antwort

1

Es scheint, dass EPPlus importierte Daten immer mit dem Format en-US analysiert. Importieren Sie also zuerst die Spalte mit den Dezimalwerten als String. Auf diese Weise wird kein Konvertierungsversuch unternommen.

ExcelTextFormat format = new ExcelTextFormat 
{ 
    Delimiter = ';', 
    DataTypes = new eDataTypes[] { eDataTypes.Number, eDataTypes.String } 
}; 

Und nachdem die Werte mit den richtigen Dezimaltrennzeichen für die Lokalisierung, Schleife der Werte importiert werden, wandeln sie das richtige Zahlenformat in Dezimalzahlen und eingestellt.

int columnNumber = 2; 

for (int i = 2; i <= rowCount; i++) 
{ 
    worksheet.Cells[i, columnNumber].Style.Numberformat.Format = "0.00"; 
    worksheet.Cells[i, columnNumber].Value = Convert.ToDecimal(worksheet.Cells[i, columnNumber].Value); 
} 
+0

Das funktioniert, wie auch immer ich nicht weiß, wie viele Spalten ein Dokument wird haben, es ist nicht immer die zweite Spalte, um eine Nummer zu haben. Kann ich den eDataTypes.String für das gesamte Dokument festlegen? –

+0

Nein, es muss pro Spalte sein, wenn Sie 'ExcelTextFormat' verwenden, aber Sie können einfach 20' eDataTypes.String' hinzufügen, so dass die ersten 20 Spalten eine Zeichenkette sind, auch wenn sie nicht in der CSV existieren. Wenn Sie jedoch die richtigen Spalten nicht kennen, wird sich die Durchführung einer Konvertierung als schwierig erweisen, es sei denn, ALLE Spalten sind numerisch/Ganzzahlen. – VDWWD

+0

Ich verwende: eDataTypes [] dataTypes = Enumerable.Repeat (eDataTypes.String, 5000). ToArray(); um die ersten 5000 Spalten String zu machen. Es ist nicht schön, aber es wird für jetzt tun, danke! –