Как установить тип столбца при использовании EPPlus - PullRequest
59 голосов
/ 25 марта 2012

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

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

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

Ответы [ 5 ]

79 голосов
/ 17 апреля 2012

Вам необходимо, чтобы столбец 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!
39 голосов
/ 04 марта 2015

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

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

2 голосов
/ 14 мая 2017

Если ваши столбцы могут перемещаться (как мы знаем, конечные пользователи склонны к переменчивости) или у вас просто разбросано много столбцов дат по электронной таблице, было бы полезно написать что-то более общее.Вот что я только что написал.Он находит положение всех типов 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";
        }

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

А здесьэто халява ... Я не могу взять кредит на этот код.Он берет список 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;
    }
1 голос
/ 16 ноября 2018

Вот хороший метод расширения C #, помогающий загрузить из коллекции заголовки и правильное форматирование даты:

(Украсьте свои свойства атрибутами Description для заголовков столбцов)

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";
            }
        }
    } 
}
1 голос
/ 30 мая 2017

Чтобы использовать сборку в форматах 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 для точных ключей.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...