2012-03-25 2 views
53

Я использую EPPlus для генерации Excel файлов, в DAL Я заполняю DataTable, заполняя данные в таблицу и передавая таблицу на уровень презентации. Оттуда я использую метод LoadFromDataTable() для создания файла Excel.Как установить тип столбца при использовании EPPlus

Все работает нормально, за исключением того, что я хочу установить один из типов столбцов на Date. Я попытался установить тип столбца моего DataTable на Date, а затем пройти DataTable до уровня презентации, но, похоже, EPPlus либо проигнорировал его, либо не узнал, потому что, когда я открываю сгенерированный файл , тип ячейки Number.

Если я вручную отформатирую ячейки и задаю их тип Date, Excel показывает правильные даты. Итак, как я могу это достичь?

ответ

70

Вам нужен столбец DataTable, чтобы иметь нужный тип, но вам также необходимо изменить свойство Style.Numberformat.Format столбца или ячейки.

Скажем у вас есть ExcelWorksheet имени ws:

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

См. Https://epplus.codeplex.com/discussions/571553 для получения дополнительной информации. – dudeNumber4

+0

И изменит ли этот формат Excel в зависимости от личных настроек Excel? Думайте о ЕС и США. – Citroenfris

36

На основе этого обсуждения (epplus.codeplex.com/discussions/349927) вы также можете установить формат столбца на сегодняшний день.

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

+5

FYI любой, это происходит из System.Globalization, поэтому вам нужно добавить это пространство имен «using System.Globalization». – MatthewD

2

Если столбцы могут передвигаться (как мы знаем, для конечных пользователей, как правило, непостоянными), или вы просто много столбцов даты, разбросанных по всей таблицы, было бы полезно, чтобы написать что-то немного более общий. Вот что я только что написал. Он находит положение всех типов DateTime в моем POCO и создает список, который затем использует для установки форматирования столбцов. Помните, что таблицы данных основаны на нулевом значении, а Excel - нет.

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

Если вы делаете более одного DataTable, вы, вероятно, хотите, чтобы реорганизовать его в функцию.

И вот халява ... Я не могу взять кредит на этот код. Он принимает список POCO и превращает его в таблицу данных. Это облегчило мою жизнь в ряде случаев, когда она была в моем «наборе инструментов». Наслаждаться.

 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

Чтобы использовать сборку в форматах Excel, вам нужно передать правильную строку

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

собственности.

Теперь, где-то позже во время выполнения, вероятно, во время сериализации EPPlus попытается сопоставить это свойство формата с текущим словарем стилей в книге. Это может зависеть от точной версии библиотеки, но, например, для ключа EPPlust 4.1.0.0 с короткими датами используется «mm-dd-yy».

Для 4.1.0.0 вы можете найти все жестко закодированные коды и ключи для создания в форматах в:

  1. ExcelNumberFormatXml.CS, internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats) - здесь все эти коды фактически включены в книгу, все жестко
  2. использовать отладчик и проверить Workbook.Styles.NumberFormats перечисление (как ключевого использования ExcelNumberFormatXml.Format)
  3. использование отладчика и проверить Workbook.Styles.NumberFormats. (не общественного memeber) _dic для точного ключи.
Смежные вопросы