2014-10-23 15 views
9

Attualmente sto utilizzando NPOI per generare file Excel basati su un database dalla mia app mdf asp.net. Ho quasi finito con il codice, tranne un piccolo problema che continuo a ricevere quando provo a scrivere le date in Excel.Problema con la scrittura di una data nel file Excel utilizzando NPOI

Nel database (MS SQL Server) Ho la data salvata come 41883, 41913, ecc ..., che in C# posso convertire in un oggetto DataTime utilizzando

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

Il codice che uso per scrivere la data in Excel sembra mentire questo:

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; 

questo è solo un esempio del mio codice (il pezzo che sta facendo la parte di scrittura data). Il problema con questo pezzo di codice è che solo una parte delle celle della data è effettivamente formattata come una data, per tutti gli altri vedo ancora i valori come nel database 41883, 41913 ecc. Che ovviamente posso selezionare e applicare Short Date/Data di formattazione da Excel (ma non lo voglio).

Qualcuno potrebbe farmi sapere perché un tale comportamento potrebbe apparire (la formattazione funziona solo per parte delle celle) ... Ho anche provato a usare HSSFDataFormat.GetBuiltinFormat ("Date") ma nessuna delle celle è stata formattata in questo caso.

enter image description here

L'immagine qui sopra spiega meglio il mio problema ... quando seleziono le prime cellule nella prima colonna vedo la cella è formattata come "Custom" ... per tutti gli altri valori che non sono formattato è generale. Una volta selezionate le celle, posso formattarlo come data da Excel senza alcun problema. Questo è strano perché lo stesso codice viene eseguito per tutte le celle della data, ma solo alcuni ottengono la formattazione corretta ...

+0

Hai esattamente questo problema. Mi chiedo se c'è una soluzione ... ancora ... –

+1

OK, ho capito cosa c'è che non va. Probabilmente stai creando un nuovo stile di cella per ogni cella. Ciò lo rovina in qualche modo a causa del gran numero di stili di cella identici. Devi solo creare uno stile di cella per l'intera cartella di lavoro, quindi passare "ICellStyle" alla proprietà 'CellStyle' della cella. –

+0

@StephenChung grazie per il vostro forte apprezzamento ... Ho appena cambiato tutto il mio codice per usare molto meno CellStyle (creando il primo tipo e poi riutilizzandolo in poi). Dovresti inserire questo commento come risposta. – Romias

risposta

5

Non c'è bisogno di convertire nulla. Devi creare uno stile e applicarlo alla tua cella

 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; 
     }