2014-10-23 4 views
9

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

В базе данных (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 и т. Д., Которые, конечно, я могу выбрать и применить короткую дату/Форматирование даты из Excel (но я не хочу этого).

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

enter image description here

Изображение выше объясняет лучше мой вопрос ... когда я выбираю первые ячейки в первой колонке я вижу ячейка отформатирована как «Custom» ... для всех остальных значений, которые не являются отформатирован это генерал. Как только я выбираю ячейки, я могу отформатировать его как дату из Excel без каких-либо проблем. Это странно, поскольку один и тот же код выполняется для всех ячеек даты, но только некоторые получают правильное форматирование ...

+0

Получил именно эту проблему. Интересно, есть ли решение ... пока ... –

+1

Хорошо, я понял, что случилось. Вероятно, вы создаете новый стиль ячейки для каждой ячейки. Это заставляет его как-то за счет большого количества одинаковых стилей ячеек. Вам нужно просто создать один стиль ячейки для всей книги, а затем передать этот элемент «ICellStyle» в свойство CellStyle ячейки. –

+0

@StephenChung благодарит за вашу резкую оценку ... Я просто изменил весь свой код, чтобы использовать гораздо меньше CellStyles (создавая его первый тип, а затем повторно его использовать). Вы должны поместить этот комментарий в качестве ответа. – Romias

ответ

5

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

 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; 
     } 
Смежные вопросы