Проблема с записью даты в файл 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;
}