2012-03-25 25 views
53

Używam EPPlus do generowania plików Excel, w DAL zapełniam DataTable, wypełniając dane w tabeli i przekazując tabelę do warstwy prezentacji. Stamtąd używam metody LoadFromDataTable() do generowania pliku Excel.Jak ustawić typ kolumny podczas korzystania z EPPlus

Wszystko działa poprawnie, z tym wyjątkiem, że chcę ustawić jeden z typów kolumn na Date. Próbowałem ustawić typ kolumny mojego DataTable na Date i przekazać DataTable do warstwy prezentacji, ale wygląda na to, że EPPlus albo to zignorowałem, albo nie rozpoznałem, ponieważ kiedy otwieram wygenerowany plik Excel, typem komórki jest Number.

Jeśli ręcznie sformatuję komórki i ustawię typ na Date, Excel wyświetli poprawne daty. Jak mogę to osiągnąć?

Odpowiedz

70

Potrzebna jest odpowiednia kolumna DataTable, ale trzeba również zmodyfikować właściwość Style.Numberformat.Format kolumny lub komórki.

że masz ExcelWorksheet nazwie ws:

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

Więcej informacji można znaleźć na stronie https://epplus.codeplex.com/discussions/571553. – dudeNumber4

+0

Czy program Excel zmieni ten format w zależności od ustawień osobistych programu Excel? Pomyśl o UE i USA. – Citroenfris

36

Na podstawie tej dyskusji (epplus.codeplex.com/discussions/349927) można również ustawić format kolumna aktualne.

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

+5

Dla każdego, to pochodzi z System.Globalization, więc musisz dodać tę przestrzeń nazw "using System.Globalization". – MatthewD

2

Jeśli kolumny mogą poruszać się (jak wiemy końcowi użytkownicy wydają się być zmienny) lub po prostu mają wiele kolumny dat rozrzuconych po całym arkuszu kalkulacyjnym, warto byłoby coś napisać trochę bardziej ogólny. Oto, co właśnie napisałem. Znajduje pozycję wszystkich typów DateTime w moim POCO i tworzy listę, którą następnie używa do ustawienia formatowania kolumny. Pamiętaj, że tabele danych mają wartość zero, a Excel nie.

 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"; 
     } 

Jeśli robisz więcej niż jeden zestaw datatable, prawdopodobnie będziesz chciał go przekonwertować na funkcję.

A tutaj jest freebie ... Nie mogę wziąć kredytu za ten kod. Pobiera listę POCO i przekształca ją w tabelę danych. Ułatwiło mi to życie przy wielu okazjach w moim "zestawie narzędzi". Cieszyć się.

 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

Aby korzystać budować w formatach Excel, trzeba przejść poprawną ciąg

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

nieruchomości.

Teraz, gdzieś później podczas wykonywania, prawdopodobnie podczas serializacji, EPPlus spróbuje dopasować właściwość tego formatu do bieżącego słownika stylów w skoroszycie. Może to zależeć od dokładnej wersji biblioteki, ale na przykład dla skrótu daty EPPlust 4.1.0.0 jest "mm-dd-rr".

Dla 4.1.0.0 można znaleźć wszystko ciężko kodowanych kody i klucze do budowania w formatach:

  1. ExcelNumberFormatXml.cs, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - tutaj wszystkie te kody są faktycznie uwzględnione w skoroszycie, wszystko zakodowane
  2. użycia debuggera i sprawdzić Workbook.Styles.NumberFormats wyliczenie (jako kluczowy użytku ExcelNumberFormatXml.Format)
  3. użycia debuggera i sprawdzić Workbook.Styles.NumberFormats. (non memeber publicznego) _dic dla dokładnego klawiatura.
Powiązane problemy