it-swarm.com.de

Festlegen des Spaltentyps bei Verwendung von EPPlus

Ich verwende EPPlus, um Excel-Dateien zu generieren. In DAL fülle ich DataTable auf, fülle Daten in die Tabelle ein und übergeben die Tabelle an Presentation Layer. Von dort verwende ich die LoadFromDataTable()-Methode, um die Excel-Datei zu generieren. 

Alles funktioniert gut, außer dass ich einen Typ der Spalte auf Date setzen möchte. Ich habe versucht, den Spaltentyp meiner DataTable aufDate zu setzen und dann DataTable an Presentation Layer zu übergeben, aber es scheint EPPlus, entweder ignoriert oder nicht erkannt zu werden, da beim Öffnen der generierten Excel-Datei Number der Typ der Zelle ist. 

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

56
Michael

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 eine ExcelWorksheet namens ws:

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

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

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

37
insilenzio

Wenn sich Ihre Spalten wahrscheinlich verschieben (die Endbenutzer neigen dazu, wankelmütig zu sein) oder viele Datumsspalten in Ihrer Tabelle verstreut sind, ist es hilfreich, etwas generischeres zu schreiben. Hier ist was ich gerade geschrieben habe. Er ermittelt die Position aller DateTime-Typen in meinem POCO und erstellt eine Liste, die dann zur Festlegung der Spaltenformatierung verwendet wird. Denken Sie daran, dass Datentabellen auf Null basieren 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 verwenden, möchten Sie sie wahrscheinlich in eine Funktion umwandeln.

Und hier ist ein Werbegeschenk ... Ich kann diesen Code nicht anerkennen. Es nimmt eine POCO-Liste und verwandelt sie in eine Datentabelle. Es hat mir das Leben in vielen Fällen erleichtert, wenn ich es in meinem 'Toolkit' habe. 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;
    }
2
midohioboarder

Um Build in Excel-Formaten zu verwenden, müssen Sie die korrekte Zeichenfolge an übergeben

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

eigentum.

Irgendwo später während der Ausführung, wahrscheinlich während der Serialisierung, versucht EPPlus nun, diese Formateigenschaft mit dem aktuellen Wörterbuch der Stile in der Arbeitsmappe abzugleichen. Es kann von der genauen Bibliotheksversion abhängen, aber für EPPlust 4.1.0.0 lautet der kurze Datumsschlüssel "mm-dd-yy".

Für 4.1.0.0 können Sie alle hartcodierten Codes und Schlüssel finden, um Formate zu erstellen:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - hier sind alle diese Codes tatsächlich in der Arbeitsmappe enthalten, alles fest codiert
  2. verwenden Sie den Debugger und überprüfen Sie Workbook.Styles.NumberFormats Aufzählung (als Schlüssel verwenden Sie ExcelNumberFormatXml.Format). 
  3. verwenden Sie den Debugger und überprüfen Sie Workbook.Styles.NumberFormats. (nicht öffentliches Memober) _dic auf exakte Schlüssel.
1
Michał Brix

Hier ist eine Nice C # -Erweiterungsmethode, die beim Laden aus der Sammlung mit Kopfzeilen und der richtigen Datumsformatierung hilft:

(Dekorieren Sie Ihre Eigenschaften mit Beschreibungsattributen für die Spaltenüberschriften.)

public static class EpPlusExtensions
{
    public static void Load<T>(this ExcelWorksheet worksheet, IEnumerable<T> collection)
    {
        worksheet.Cells["A1"].LoadFromCollection(collection, true);

        var properties = typeof(T).GetProperties();

        for (var i = 0; i < properties.Length; i++)
        {
            if (new []{typeof(DateTime), typeof(DateTime?)}.Contains(properties[i].PropertyType)) 
            {
                worksheet.Column(i + 1).Style.Numberformat.Format = "m/d/yyyy";
            }
        }
    } 
}
0
Brennan Pope