Как установить тип столбца при использовании EPPlus


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

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

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

4 55

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 вы можете найти все жестко запрограммированные коды и ключи для сборки в форматах в:

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