2015-07-21 7 views
6

ich eine Tabelle aus einer List<object[]> erschaffe mit LoadFromArraysEPPlus Wie kann ich eine Tabelle erzeugen, wo Zahlen sind Zahlen Text nicht

Der erste Eintrag des Arrays ist ein Titel, die anderen Einträge sind möglicherweise Zahlen, Text oder Daten (aber das gleiche für jedes Array in der Liste).

Die generierte Excel-Tabelle enthält das grüne Dreieck Warnung, dass Zahlen als Text formatiert sind.

I Schleife durch alle Zellen und setzte ihr Format wie so Anzahl ws.Cells[i, j].Style.Numberformat.Format = "0";

aber das Problem bleibt, und ich immer noch die grüne Warnung sehen, auch wenn das Zahlenformat auf Nummer gesetzt wird, wenn ich in den Format Cell... aussehen Dialog.

Was sind meine Optionen hier? Es ist mir möglich, ein bisschen mehr darüber zu wissen, welcher Typ in jeder Spalte ist, aber wie setze ich dann einen Spaltentitel ein?

Gibt es eine bessere Lösung als EPPlus? oder etwas mehr Nachbearbeitung der Tabelle, die ich vor dem Download machen kann?

+1

Normalerweise stammen diese grünen Dreiecke aus Zahlen (im Code), die in String Vars oder Eigenschaften gespeichert sind. Unabhängig davon, wie Sie Excel einrichten, müssen Sie die Zeichenfolge in eine Zahl im Code konvertieren. Könnte das der Fall sein? – Ernie

Antwort

8

Da Sie Objekte Arrays verwenden, können sie Zahlen und Strings enthalten, die wie Zahlen aussehen werden Sie durch jedes Objekt gehen und seinen Typ bestimmen:

[TestMethod] 
public void Object_Type_Write_Test() 
{ 
    //http://stackoverflow.com/questions/31537981/using-epplus-how-can-i-generate-a-spreadsheet-where-numbers-are-numbers-not-text 
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 

    //Some data 
    var list = new List<Object[]> 
    { 
     new object[] 
     { 
      "111.11", 
      111.11, 
      DateTime.Now 
     } 
    }; 

    using (var package = new ExcelPackage(existingFile)) 
    { 
     var ws = package.Workbook.Worksheets.Add("Sheet1"); 
     ws.Cells[1, 1, 2, 2].Style.Numberformat.Format = "0"; 
     ws.Cells[1, 3, 2, 3].Style.Numberformat.Format = "[$-F400]h:mm:ss\\ AM/PM"; 

     //This will cause numbers in string to be stored as string in excel regardless of cell format 
     ws.Cells["A1"].LoadFromArrays(list); 

     //Have to go through the objects to deal with numbers as strings 
     for (var i = 0; i < list.Count; i++) 
     { 
      for (var j = 0; j < list[i].Count(); j++) 
      { 

       if (list[i][j] is string) 
        ws.Cells[i + 2, j + 1].Value = Double.Parse((string) list[i][j]); 
       else if (list[i][j] is double) 
        ws.Cells[i + 2, j + 1].Value = (double)list[i][j]; 
       else 
        ws.Cells[i + 2, j + 1].Value = list[i][j]; 

      } 
     } 

     package.Save(); 
    } 
} 

Mit dem oben sehen Sie das Bild unten als Beachten sie die Ausgabe der oberen Zelle linken Ecke mit dem grünen Pfeil, weil es sich um eine Zeichenfolge war, die von LoadFromArray geschrieben wurde, die wie eine Zahl aussieht:

Excel Output

+0

Ein Dankeschön und ein kleiner Tick sind eine kleine Entschädigung für diese fantastische Hilfe ... Ich habe mich wirklich mit diesem hier herumgeschlagen! – Loofer

+0

@Loofer Na, kein Problem. Froh, dass es geholfen hat. – Ernie

1

ich eine Verlängerung meth erstellt od LoadFormulasFromArray, basierend auf EPPlus LoadFromArray. Die Methode geht davon aus, dass alle Objekte in der Liste als Formeln behandelt werden (im Gegensatz zu LoadFromArray). Das große Bild ist, dass beide Value und Formula Eigenschaften string statt eines bestimmten Typs nehmen. Ich sehe das als einen Fehler, da es keine Möglichkeit gibt, zu unterscheiden, ob die Zeichenfolge oder Formula ist. Die Implementierung eines Typs Formula würde Überlastung und Typprüfung ermöglichen, wodurch es möglich wird, immer das Richtige zu tun.

// usage: ws.Cells[2,2].LoadFormulasFromArrays(MyListOfObjectArrays) 

public static class EppPlusExtensions 
{ 
    public static ExcelRangeBase LoadFormulasFromArrays(this ExcelRange Cells, IEnumerable<object[]> Data) 
    { 
     //thanx to Abdullin for the code contribution 
     ExcelWorksheet _worksheet = Cells.Worksheet; 
     int _fromRow = Cells.Start.Row; 
     int _fromCol = Cells.Start.Column; 
     if (Data == null) throw new ArgumentNullException("data"); 

     int column = _fromCol, row = _fromRow; 

     foreach (var rowData in Data) 
     { 
      column = _fromCol; 
      foreach (var cellData in rowData) 
      { 
       Cells[row, column].Formula = cellData.ToString(); 
       column += 1; 
      } 
      row += 1; 
     } 
     return Cells[_fromRow, _fromCol, row - 1, column - 1]; 
    } 
} 
Verwandte Themen