Как установить тип столбца при использовании EPPlus
я использую EPPlus
для создания Excel
файлы, в DAL я заполняю DataTable
, заполнение данных в таблицу и передача таблицы на уровень представления. Оттуда я использую LoadFromDataTable()
метод для создания .
все работает нормально, за исключением того, что я хочу установить один типа столбца Date
. Я попытался установить тип столбца моего DataTable
доDate
и передать DataTable
до уровня презентации, но кажется EPPlus
либо игнорировали его, либо не узнал, потому что когда я открываю сгенерированный Excel
файл, тип ячейки Number
.
если я вручную форматирую ячейки и устанавливаю тип в Date
,Excel
показывает правильные даты. Так как же я могу этого достичь ?
4 ответа:
вам нужно, чтобы столбец DataTable имел правильный тип, но вам также нужно изменить стиль столбца или ячейки.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!
на основе этого обсуждения (epplus.codeplex.com/discussions/349927) вы также можете установить формат столбца на дату.
worksheet_1.Cells[row, 3].Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
Если ваши столбцы, вероятно, будут перемещаться (как мы знаем, конечные пользователи, как правило, непостоянны) или у вас просто много столбцов даты, разбросанных по вашей электронной таблице, было бы полезно написать что-то более общее. Вот что я только что написал. Он находит положение всех типов 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; }
чтобы использовать build в форматах excel, вам нужно передать правильную строку в
sheet.Cells[1, 1].Style.Numberformat.Format
собственность.
теперь, где-то позже во время выполнения, вероятно, во время сериализации, EPPlus попытается сопоставить это свойство формата с текущим словарем стилей в рабочей книге. Это может зависеть от точной версии библиотеки, но например для EPPlust 4.1.0.0 короткий ключ даты "mm-dd-yy".
для 4.1.0.0 вы можете найти все жестко запрограммированные коды и ключи для сборки в форматах в:
- ExcelNumberFormatXml.cs,
internal static void AddBuildIn(XmlNamespaceManager NameSpaceManager, ExcelStyleCollection<ExcelNumberFormatXml> NumberFormats)
- здесь все эти коды фактически включены в рабочую книгу, все жестко закодированы- используйте отладчик и проверьте
Workbook.Styles.NumberFormats
перечисление (в качестве ключа используйтеExcelNumberFormatXml.Format
)- используйте отладчик и проверьте
Workbook.Styles.NumberFormats.
(не включая общественные)_dic
для точного ключей.