C# - OpenOffice XML Формат даты - PullRequest
0 голосов
/ 10 февраля 2020

У меня возникла проблема при передаче некоторых данных в электронную таблицу Excel с использованием OOX. Дело в том, что все отлично работает, за исключением дат, которые отображаются в виде цифры c вместо формата datetime. Вот мой код:

private object ProcessXLSFile(PayeesWorkingHoursFullDataDTO payeesWorkingHoursFullDataDTO)
    {
        DataTable dt = Functions.ObjectToDataTable(payeesWorkingHoursFullDataDTO.ListWorkingHours);

        ExcelPackage pck = new ExcelPackage();

        //Create the worksheet
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("WorkSheet1");

        //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
        ws.Cells["A1"].LoadFromDataTable(dt, true);

        string _range = "G2:G" + (dt.Rows.Count + 1).ToString();
        using (ExcelRange col = ws.Cells[_range])
        {
            col.Style.Numberformat.Format = "#,##0.00";
            col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
        }

        _range = "J2:J" + (dt.Rows.Count + 1).ToString();
        using (ExcelRange col = ws.Cells[_range])
        {
            col.Style.Numberformat.Format = "dd/MM/yyyy";
            col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        }

        _range = "T2:T" + (dt.Rows.Count + 1).ToString();
        using (ExcelRange col = ws.Cells[_range])
        {
            col.Style.Numberformat.Format = "dd-MM-yyyy";
            col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        }

        //Write it back to the client
        Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
        Response.AddHeader("content-disposition", "attachment; filename=Payee-Grid.xlsx");
        Response.BinaryWrite(pck.GetAsByteArray());
        Response.End();

        throw new NotImplementedException();
    }

В этих строках столбцы должны быть преобразованы в datetime:

_range = "J2:J" + (dt.Rows.Count + 1).ToString();
        using (ExcelRange col = ws.Cells[_range])
        {
            col.Style.Numberformat.Format = "dd/MM/yyyy";
            col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        }

Но это определенно не работает.

Это код, в котором я создаю DataTable:

public static DataTable ObjectToDataTable<T>(this IList<T> data)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
        DataTable table = new DataTable();
        foreach (PropertyDescriptor prop in properties)
            table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
        foreach (T item in data)
        {
            DataRow row = table.NewRow();
            foreach (PropertyDescriptor prop in properties)
                row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
            table.Rows.Add(row);
        }
        return table;
    }

Отладка столбцов Мне удалось увидеть, что вплоть до строк, где я форматирую столбцы в "dd-MM-гггг", информация о дате все еще в формате datetime. Я перепробовал все, но я действительно не могу заставить это работать должным образом. Ребята, вы знаете, как заставить это работать?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы пробовали:

_range = "J2:J" + (dt.Rows.Count + 1).ToString();
        using (ExcelRange col = ws.Cells[_range])
        {
            col.Style.Numberformat.Format = "dd\\/MM\\/yyyy";
            col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        }

Иногда, по неизвестным причинам, вы должны избегать вещей :-)

0 голосов
/ 19 февраля 2020

Проблема была с шириной столбцов. По какой-то причине, если ширина была слишком узкой, весь текст в ячейках был преобразован в ####, странная вещь. Я понял это, потому что это был только визуальный сбой, значения в ячейках, где правильные. Использование AutoFit () во всех ячейках сетки решило проблему. Спасибо всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...