2014-02-23 27 views
1

我對excel有很奇怪的問題。我有兩個文件,每個文件只有一列是日期,使用c#interoop庫我打開每個文件並保存爲csv。如果我打開每個excel,那麼時間格式爲dd/MM/YYYY,但現在最新情況發生,保存到csv後一個excel具有相同的時間格式,即dd/MM/YYYY,但另一個格式爲MM/dd/YYYY,如何這可能嗎 ?Excel語言環境錯誤時間格式化

這是代碼保存爲CSV:

var application = new Application(); 
    var workbooks = application.Workbooks; 
    var workbook = workbooks.Open(file); 


    application.DisplayAlerts = false; 

    var tempFile = file.Substring(0, file.Length - 4) + ".csv"; 

    if (File.Exists(tempFile)) 
     Directory.Delete(tempFile); 

    workbook.SaveAs(tempFile, XlFileFormat.xlCSVWindows); 
    Extensions.DisposeExcel(workbook, application, workbooks, null, null); 

我沒有設置在應用程序的任何本地化。也許值得一提的是,一個excel包含xlsx extenstaion,另一個包含xls的更多版本(whis一天中的翻天)。

還有一件事,我注意到,當我將這些excel保存爲csv並使用excel保存時,則一切正常。

+0

您的計算機中的區域日期設置是什麼?可能發生的事情是,excel令人困惑,每個月都會令人困惑。 – CRondao

+0

是的,但正如我所說,有兩個優點,一個是好的,另一個在保存到csv後,一個月與一個月相反。 – kosnkov

+1

請指定excel文件的工作是否正確。 xlsx還是xls? –

回答

1

我做了一個關於你描述的問題的例子。我用你的代碼(改編了一下)和兩個Excel文件。不幸的是,我無法重現你的問題。

// call the method with .xlsx and .xls file. 
//export2Csv(@"e:\temp\demoNEW.xlsx"); 
//export2Csv(@"e:\temp\demoOLD.xls"); 

private static void export2Csv(string fileName) 
{ 
    string csvFile = Path.ChangeExtension(fileName, "csv"); 

    var application = new Application(); 
    var workbooks = application.Workbooks; 
    var workbook = workbooks.Open(fileName); 

    application.DisplayAlerts = false; 

    // ATTENTION!! german number format, must be adapted to your locale culture/language 
    workbook.ActiveSheet.Range["A1", "A65535"].NumberFormat = "TT/MM/JJJJ hh:mm:ss"; 

    workbook.SaveAs(csvFile, XlFileFormat.xlCSVWindows); 

    // clean up Excel - I think Extensions.DisposeExcel(..) does the same?! 
    application.Quit(); 
    workbook = null; 
    application = null; 
    GC.WaitForPendingFinalizers(); 
    GC.Collect(); 
} 

首先我創建了一個.xlsx文件並輸入一些日期(2014年1月1日至2014年1月31日德國格式),之後保存爲.xls文件。

當運行我的代碼這兩個文件在dd/MM/yyyy中創建了相同的結果。我也做了一些背景調查。

每當管理客戶端調用COM對象上的方法,它需要 在區域性特定信息傳遞,但它因此使用 的CurrentCulture(區域)匹配當前線程語言環境。 當前線程語言環境默認從用戶的區域設置 繼承。

    SO
  • 我發現了一個問題&答案確定Excel語言顯示如何顯示目前的制度文化和卓越的UI文化

檢查這個片段

CultureInfo cSystemCulture = Thread.CurrentThread.CurrentCulture; 
CultureInfo cExcelCulture = new CultureInfo(application.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDUI)); 

Console.WriteLine(cSystemCulture); 
Console.WriteLine(cExcelCulture); 
  • 一些寶STS SO ExcelNumberFormat描述解決調用從一個所有的代碼和相同的線程和CultureInfo的的en-US

  • 他人推薦給具有一定NUMBERFORMAT每個單元的格式(參見social.msdn

所以不是一個解決方案,但我希望至少給你一些好的提示。

在這些點的情況下,沒有一個可以幫助你,你仍然可以給我你的.xlsx和.xls文件,以[email protected],我將作進一步的考慮)

編輯 根據給定的文件,我找到了你的問題的答案。您的文件right.xls是一個Excel文件,但您的文件wrong.xls包含HTML標記。所以唯一的問題是錯誤的文件擴展名!

wrong.xls應改名爲wrong.html

說了這樣的話,我試圖弄清楚,儘管事實上有兩個不同的輸入文件,我的代碼如何工作。所以我改變了我的代碼(已經在上面編輯)並且添加了一行手動設置數字格式

// ATTENTION!! german number format, must be adapted to your locale culture/language 
workbook.ActiveSheet.Range["A1", "A65535"].NumberFormat = "TT/MM/JJJJ hh:mm:ss"; 

之後,兩個輸入文件都打印出相同的dateTime格式。

+0

請給我你的郵件地址或將它發送給我:[email protected],我會向你發送這兩個文件。 – kosnkov

+0

看到我的回答:[email protected] –

+0

更新我的答案作爲發送文件 –