2010-07-22 61 views
27

Iam使用Office Interop將DataTable導出到Excel文件。問題是,Excel不能識別日期,而是顯示數字。在另一種情況下,我傳遞一個字符串,然後將其識別爲日期。在這兩種情況下,數據都是混亂的。將數據寫入Excel時如何製作正確的日期格式

我想這應該存儲在文本格式的單元格的NumberFormat @,但它也不能工作。

  Application app = new Application(); 
      app.Visible = false; 
      app.ScreenUpdating = false; 
      app.DisplayAlerts = false; 
      app.EnableAnimations = false; 
      app.EnableAutoComplete = false; 
      app.EnableSound = false; 
      app.EnableTipWizard = false; 
      app.ErrorCheckingOptions.BackgroundChecking = false; 

      Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet); 
      Worksheet ws = (Worksheet)wb.Worksheets[1]; 

      for (int j = 0; j < dt.Rows.Count; j++) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        Range rng = ws.Cells[j+2, i+1]as Range; 
        rng.Value2 = dt.Rows[j][i].ToString(); 
        rng.NumberFormat = "@"; 
       } 
      }   

      wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
        Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 

      wb.Close(false, Missing.Value, Missing.Value);    

      app.Workbooks.Close(); 
      app.Application.Quit(); 
      app.Quit();  
      System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(app); 
      ws = null; 
      wb = null; 
      app = null; 
      GC.Collect(); 

爲什麼我的NumberFormat @工作不正常? Textformat不應該顯示與我放置的內容相同的內容嗎?

回答

31

你嘗試格式化整個列作爲一個日期列?事情是這樣的:

Range rg = (Excel.Range)worksheetobject.Cells[1,1]; 
rg.EntireColumn.NumberFormat = "MM/DD/YYYY"; 

你可以嘗試要放一個滴答中的字符串表達式,然後再加載文本Excel單元格(之前其他的事情不知道,如果該事項或沒有,但它的工作原理打字時文本直接進入細胞)。

+0

格式化每個單元格應該沒有區別。我如何正確地格式化所有文本? – codymanix 2010-07-22 16:17:50

+0

如果您希望Excel將列視爲日期列,那麼它應該確實具有日期格式,否則會發生奇怪的事情,您已經體驗過。但是,您可以參考我的最新編輯以獲取其他可能的解決方法。 – dcp 2010-07-22 16:33:17

7

使用

DateTime.ToOADate() 

,並把嘗試,如在細胞雙。在Mac系統上可能會出現Excel問題(它使用不同的日期時間 - >雙重轉換),但在大多數情況下它應該可以正常工作。

希望這會有所幫助。

+0

爲什麼我的工作不?我希望所有的東西都顯示出來,就像我把它放進去一樣。 – codymanix 2010-07-22 16:16:05

+0

好的解決方案...一切都失敗了! – Sheridan 2016-04-11 09:26:44

+0

Upvote!工作時,一切都失敗了! – 2017-12-11 11:49:24

2

我知道這個問題是舊的,但填充的Excell細胞通過VSTO日期有幾個陷阱的。

我發現式的不與YYYY-MMM-dd格式的日期的工作 - 即使細胞日期格式!您必須將日期轉換爲dd/mm/yyyy格式才能在配方中使用。

例如日期,我收到從SQL分析服務器回來,我不得不將它們翻轉,然後進行格式化:

using (var dateRn = xlApp.Range["A1"].WithComCleanup()) 
{ 
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy"); 
} 


using (var rn = xlApp.Range["A1:A10"].WithComCleanup()) 
{ 
    rn.Resource.Select(); 
    rn.Resource.NumberFormat = "d-mmm-yyyy;@"; 
} 

否則公式的使用日期不在工作 - 在單元格公式C4相同C3:

enter image description here

1

老問題,但仍然具有現實意義。我已經生成的字典,得到每個區域的適當日期時間格式,這裏是我所產生的輔助類:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW這是我去一下吧:

  1. 打開的Excel ,手動輸入日期時間到工作簿的第一個單元格
  2. 打開控制面板中的區域對話框
  3. 使用間諜找出區域組合框和應用按鈕的HWND的,所以我可以使用SetFore groundWindow和SendKey改變區域(找不到如何通過Windows API改變區域)
  4. 通過各地區,每個地區重複問Excel中包含日期的單元格的NumberFormat的,保存這些數據到文件
+0

這可能不是提問者想到的答案,但我覺得它非常有幫助(但我希望有一個更直接的解決方案......)。感謝分享你的代碼! – habakuk 2017-02-22 10:59:13

+1

是的,我正在尋找一個更簡單的解決方案,但花了幾個小時後,結論就是沒有一個。 Excel只是不公開區域格式化日期的方式。我發佈這個是因爲接受的答案沒有考慮到這一點。它適用於英語和其他大多數文化,但會失敗德國,法國和許多其他地區。是的,也許不是OP應得的答案,但他需要的答案是:) – anakic 2017-02-22 13:17:17

0

這爲我工作:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", ""); 
0

這爲我工作:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy"); 

注意蜱米約櫃在日期前添加。

相關問題