Excel语言环境错误的时间格式化

时间:2014-02-23 09:57:13

标签: c# excel

我对excel有一个非常奇怪的问题。我有两个文件,每个文件只有一个日期列,使用c#interoop库我打开每个文件并保存为csv。如果我打开每个excel,那么时间格式是dd / MM / YYYY但是现在发生了什么,在保存到csv之后,一个excel具有相同的时间格式,即dd / MM / YYYY但是另一个具有MM / dd / YYYY,如何这可能吗 ?

这是保存为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扩展,而另一个(whis是每月翻转)与xls相比更长。

还有一件事,我注意到当我使用excel save将这些excel保存为csv时,一切都很好。

1 个答案:

答案 0 :(得分: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);
  • 有些帖子SO ExcelNumberFormat描述了一个解决方案来调用来自同一个线程和cultureInfo en-US

    <的所有代码/ LI>
  • 其他人建议使用特定数字格式格式化每个单元格(请参阅social.msdn

所以不是一个解决方案,但我希望至少为你提供一些好的提示。

如果这些点都没有帮助你,你仍然可以将你的.xlsx和.xls文件发送给franz.pilgerstorfer@gmx.at,我将进一步研究)

修改 根据给定的文件,我找到了你的问题的答案。您的文件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格式。