2012-03-25 16 views
53

Ich verwende EPPlus, um Excel Dateien zu generieren, in DAL bevölke ich DataTable, fülle Daten in Tabelle und übergabe der Tabelle an Presentation Layer. Von dort verwende ich LoadFromDataTable() Methode, um Excel Datei zu generieren.So legen Sie den Spaltentyp bei der Verwendung von EPPlus fest

Alles funktioniert gut, außer dass ich einen der Spalte Typ auf Date setzen möchte. Ich habe versucht, Spaltentyp meines DataTable zu Date zu setzen und als DataTable zu Presentation Layer passieren, aber es scheint EPPlus entweder ignoriert es oder nicht erkennen, denn wenn ich Excel Datei generiert bin Öffnen, Zelle Typ Number ist.

Wenn ich Zellen manuell formatiere und Type auf Date einstelle, zeigt Excel korrekte Daten an. Wie kann ich das erreichen?

Antwort

70

Sie benötigen die DataTable-Spalte, um den richtigen Typ zu haben, aber Sie müssen auch die Style.Numberformat.Format-Eigenschaft der Spalte oder Zelle ändern.

Angenommen, Sie haben ein ExcelWorksheetws genannt:

ws.Column(1).Style.Numberformat.Format = "yyyy-mm-dd"; 
//OR "yyyy-mm-dd h:mm" if you want to include the time! 
+0

Weitere Informationen finden Sie unter https://epplus.codeplex.com/discussions/571553. – dudeNumber4

+0

Und wird Excel dieses Format abhängig von den persönlichen Excel-Einstellungen ändern? Denken Sie an EU und USA. – Citroenfris

36

auf dieser Diskussion Basierend (epplus.codeplex.com/discussions/349927) Sie auch Spaltenformat auf dem neuesten Stand setzen können.

worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;

+5

FYI jemand, das kommt von System.Globalization, also müssen Sie diesen Namespace "using System.Globalization" hinzufügen. – MatthewD

2

Wenn Ihre Spalten sind wahrscheinlich zu bewegen (wie wir wissen Endnutzern neigen wankelmütig zu sein) oder Sie haben gerade viele Datumsspalten in Ihrer Tabelle zerstreut, wäre es hilfreich, etwas ein wenig zu schreiben generischer. Hier ist, was ich gerade geschrieben habe. Es findet die Position aller DateTime-Typen in meinem POCO und erstellt eine Liste, die es dann verwendet, um die Spaltenformatierung festzulegen. Beachten Sie, dass Datentabellen nullbasiert sind und Excel nicht.

 ws.Cells.LoadFromDataTable(tbl, true); 
     var dPos = new List<int>(); 
     for (var i = 0; i < tbl.Columns.Count; i++) 
      if (tbl.Columns[i].DataType.Name.Equals("DateTime")) 
       dPos.Add(i); 
     foreach (var pos in dPos) 
     { 
      ws.Column(pos+1).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM"; 
     } 

Wenn Sie mehr als eine Datentabelle tun, werden Sie wahrscheinlich wollen es in eine Funktion, Refactoring ab.

Und hier ist ein Freebie ... Ich kann nicht für diesen Code Anerkennung. Es nimmt eine POCO-Liste und wandelt sie in eine Datentabelle um. Es hat mein Leben bei mehreren Gelegenheiten leichter gemacht, als ich es in meinem "Toolkit" hatte. Genießen.

 public DataTable ConvertToDataTable<T>(IList<T> data) 
    { 
     var properties = 
      TypeDescriptor.GetProperties(typeof(T)); 
     var table = new DataTable(); 
     foreach (PropertyDescriptor prop in properties) 
      table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType); 
     foreach (T item in data) 
     { 
      var row = table.NewRow(); 
      foreach (PropertyDescriptor prop in properties) 
       row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
      table.Rows.Add(row); 
     } 
     return table; 
    } 
0

zu bauen in Excel-Format verwenden, müssen Sie richtigen Zeichenfolge

sheet.Cells[1, 1].Style.Numberformat.Format 

Eigentum zu übergeben.

Nun wird EPPlus irgendwo während der Ausführung, wahrscheinlich während der Serialisierung, versuchen, diese Formateigenschaft mit dem aktuellen Wörterbuch der Stile in der Arbeitsmappe abzugleichen. Dies hängt möglicherweise von der genauen Bibliotheksversion ab, aber zum Beispiel für EPPlust 4.1.0.0 ist der kurze Datumsschlüssel "mm-dd-yy".

Für 4.1.0.0 Sie alle hartcodierte Codes und Schlüssel finden können in den Formaten in bauen:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - hier alle diese Codes sind tatsächlich in Arbeitsmappe enthalten, alle
  2. Verwendung Debugger-hart codiert und Workbook.Styles.NumberFormats Aufzählung überprüfen (als Schlüssel verwenden ExcelNumberFormatXml.Format)
  3. Verwendung Debugger und überprüfen Workbook.Styles.NumberFormats. (nicht öffentlich memeber) _dic zur exakten Schlüssel.
Verwandte Themen