2013-03-24 154 views
4

我的程序在Excel中創建輸出。Excel Interop單元格日期格式

一些日期似乎越來越誤解: enter image description here

在打開該文件的日期,如屏幕截圖的混合物。
如果我實際上將光標放在Excel的計算框中(在screenprint中)並按回車,單元格的格式將恢復爲正確的格式。

我正在使用Microsoft.Office.Interop.Excel將數據從Datatable移至保存在我的解決方案中的Excel模板。

之前將數據放入細胞我改變各列的NumberFormat相應使用switch

for(int i = 1; i < NumColumns + 1; i++) { 
    switch(dt.Columns[i-1].DataType.ToString()) { 
     case "System.Int32": 
      xlWorkSheet.Columns[i].NumberFormat = "#,##0_ ;[Red]-#,##0 "; 
      break; 
     case "System.String": 
      xlWorkSheet.Columns[i].NumberFormat = "@"; 
      break; 
     case "System.DateTime": 
      xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy"; 
      break; 
     case "System.Date": 
      xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy"; 
      break; 
     default: 
      xlWorkSheet.Columns[i].NumberFormat = "@"; 
      break; 
    } 
} 

要移動從數據表中的值我使用嵌套循環:

//move header totals into the spreadsheet 
for(int i = 1; i < NumColumns + 1; i++) { 
    xlWorkSheet.Cells[1, i].value = dt.Columns[i - 1].ColumnName; 
} 

//move in the data 
DataView dv = new DataView(dt); 
dv.Sort = "Date ASC"; 

int rowCount = 2; 
string theValue; 
try { 
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows) 
     for(int i = 1; i < NumColumns + 1; i++) { 
      theValue = dr[i - 1].ToString(); 
      xlWorkSheet.Cells[rowCount, i].value = theValue; 
     } 
     rowCount += 1; 
    } 
} catch(Exception) { 
    throw; 
} 

在存儲當我填充數據表我試着用DATETIME和以下內容明確地說明了類型:

SELECT 
"Date" = CONVERT(DATE,b.[Date]) 
    ... 

如何使我的日期數據如此明確以至Excel無法曲解並且應用所有所需的格式?


編輯

下一頁(未經測試)在嵌套循環嘗試如下:

int rowCount = 2; 
string theValue; 
DateTime dtm; 
DateTime d; 
try { 
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows) 
     for(int i = 1; i < NumColumns + 1; i++) { 
      //theValue = dr[i - 1].ToString(); 
      //xlWorkSheet.Cells[rowCount, i].value = theValue; 
      switch(dr[i - 1].GetType().ToString()) { 
       case "System.DateTime": 
        dtm = Convert.ToDateTime(dr[i - 1]); 
        xlWorkSheet.Cells[rowCount, i].value = dtm.ToOADate(); 
        break; 
       case "System.Date": 
        d = Convert.ToDateTime(dr[i - 1]); 
        xlWorkSheet.Cells[rowCount, i].value = d.ToOADate(); 
        break; 
       default: 
        theValue = dr[i - 1].ToString(); 
        xlWorkSheet.Cells[rowCount, i].value = theValue; 
        break; 
      } 

     } 
     rowCount += 1; 
    } 
} catch(Exception) { 
    throw; 
} 

回答

5

這裏的問題是,你作爲一個字符串寫入一切Excel和Excel將以這種方式存儲它。在編輯並按Enter鍵後,Excel將重新解釋單元格內容,然後可能以不同的方式存儲它。

當您在DateTime上調用ToString()時,默認格式的格式爲DD/MM/YY HH:mm:ss,這正是您在結果文件中看到的內容。

Excel中的日期存儲爲表示自1900年以來經過的天數的數字。要獲取此數字,您可以調用ToOADate()方法。

http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx

隨着數據設置爲double和適當的格式字符串,你應該得到你希望的結果!我應該執行嵌套循環內`之開關,對於`datatype`測試;:

+0

... + 1個感謝如果它的日期時間使用'ToOADate()';如果它的字符串,然後使用'ToString()'等? – whytheq 2013-03-25 09:19:11

+0

是的,這將工作。另外,我認爲'DataRow'索引器(例如'dr [i-1]')將根據列類型爲您打字。所以你應該能夠測試返回對象(例如'if(value is DateTime)'並且調用'ToOADate()'。 – 2013-03-25 13:06:21

+0

...好的 - 我將用新的嵌套循環編輯我的OP - 我還沒有測試過,我在黑暗中感覺有點;所以不要笑! – whytheq 2013-03-25 13:38:10

-3

只是(格式化值),這個替換(串)

+0

這不起作用,因爲Excel將使用不同的區域設置重新解釋字符串作爲日期(因此設置01/09/2017的日期可以通過Excel認爲它是09/01/2017) – 2017-12-14 09:48:40