Проблема с записью даты в файл Excel с использованием NPOI

В настоящее время я использую NPOI для создания файлов Excel на основе базы данных из моего приложения asp.net mvc. Я почти закончил с кодом, за исключением одной маленькой проблемы, которую я продолжаю получать, когда пытаюсь записать Dates в Excel.

В базе данных (MS SQL Server) у меня есть дата, сохраненная как 41883, 41913 и т. Д., Которые в C# я могу преобразовать в объект DataTime, используя

DateTime dt = DateTime.FromOADate(Convert.ToDouble(41883));

Код, который я использую для записи даты в Excel, выглядит так:

var cell = excelRow.CreateCell(columnIndex);
IDataFormat format = workbook.CreateDataFormat();
short dateFormat = format.GetFormat("dd/MM/yyyy");
cell.SetCellValue(DateTime.FromOADate(Convert.ToDouble(dbDateValue)));
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.DataFormat = dateFormat;
cell.CellStyle = cellStyle;

это всего лишь пример моего кода (часть, которая делает часть написания даты). Проблема с этим фрагментом кода состоит в том, что только часть ячеек даты фактически отформатирована как дата, для всех остальных я все еще вижу значения, как в базе данных 41883, 41913 и т. Д., Которые, конечно, я могу выбрать и применить Short Date/ Форматирование даты из Excel (но я этого не хочу).

Может кто-нибудь сообщить мне, почему такое поведение может появиться (форматирование работает только для части ячеек)... Я даже пытался использовать HSSFDataFormat.GetBuiltinFormat("Date"), но ни одна из ячеек не была отформатирована в этом случае.

Изображение выше лучше объясняет мою проблему... когда я выбираю первые ячейки в первом столбце, я вижу, что ячейка отформатирована как "Пользовательская"... для всех других значений, которые не отформатированы, это Общие. После того, как я выбрал ячейки, я могу без проблем отформатировать его как дату в Excel. Это странно, поскольку один и тот же код выполняется для всех ячеек даты, но только некоторые получают правильное форматирование...

1 ответ

Не нужно ничего конвертировать. Вы должны создать стиль и применить его к своей ячейке

        var newDataFormat = workbook.CreateDataFormat();
        var style = workbook.CreateCellStyle();
        style.BorderBottom = BorderStyle.Thin;
        style.BorderLeft = BorderStyle.Thin;
        style.BorderTop = BorderStyle.Thin;
        style.BorderRight = BorderStyle.Thin;
        style.DataFormat = newDataFormat.GetFormat("MM/dd/yyyy HH:mm:ss");

        foreach (var objArticles in tempArticles)
        {
            //Create a new Row
            var row = sheet.CreateRow(rowNumber++);

            //Set the Values for Cells
            row.CreateCell(0).SetCellValue(objArticles.ProjectId);
            row.CreateCell(1).SetCellValue(objArticles.ProjectName);
            row.CreateCell(2).SetCellValue(objArticles.MetricDescription);
            row.CreateCell(3).SetCellValue(objArticles.MetricValue);             
            var cell = row.CreateCell(4);
            cell.SetCellValue(objArticles.BuildDate);
            cell.CellStyle = style; 
            var cell5 = row.CreateCell(5);
            cell5.SetCellValue(objArticles.CreateDate);
            cell5.CellStyle = style;
        }
Другие вопросы по тегам