Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Для столбца 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!

Ответ 2

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

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

Ответ 3

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

Ответ 4

Чтобы использовать сборку в форматах 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. (non public memeber) _dic для точных ключей.