C# Excel区域设置错误的时间格式化

C# Excel区域设置错误的时间格式化,c#,excel,C#,Excel,我对excel有很奇怪的问题。我有两个文件,每个文件只有一列是日期,使用c#互操作库打开每个文件并另存为csv。如果我打开每个excel,那么时间格式是dd/MM/YYYY,但现在发生了什么,保存到csv后,一个excel的时间格式是dd/MM/YYYY,而另一个excel的时间格式是MM/dd/YYYY,这怎么可能呢 这是另存为csv的代码: var application = new Application(); var workbooks = application.Work

我对excel有很奇怪的问题。我有两个文件,每个文件只有一列是日期,使用c#互操作库打开每个文件并另存为csv。如果我打开每个excel,那么时间格式是dd/MM/YYYY,但现在发生了什么,保存到csv后,一个excel的时间格式是dd/MM/YYYY,而另一个excel的时间格式是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扩展,而另一个excel(whis是以月为单位翻转的)使用xls要老得多


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

我就您描述的问题做了一个示例。我使用了你的代码(稍加修改)和两个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(区域设置)。这个 当前线程区域设置继承自用户的区域设置 默认情况下

  • 在中,我找到了一个问答确定Excel语言,它显示了如何显示当前系统区域性和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);
  • 一些帖子描述了一种从同一个线程和cultureInfo调用所有代码的解决方案

  • 其他人建议使用特定的数字格式设置每个单元格的格式(请参阅)

所以这不是一个很好的解决方案,但我希望至少能给你一些好的提示

如果以上几点对你都没有帮助,你仍然可以将你的.xlsx和.xls文件发送给franz。pilgerstorfer@gmx.at我将进一步调查)

编辑 根据给定的文件,我找到了你问题的答案。您的文件
right.xls
是一个Excel文件,但您的文件
error.xls
包含HTML标记。所以唯一的问题是文件扩展名错误

错误.xls
应重命名为
错误.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";  

之后,两个输入文件打印出相同的日期时间格式。

您的计算机中的区域日期设置是什么?excel可能会混淆月份和日期。BE-BE,但正如我所说的,有两个excel,一个是ok,另一个在保存到csv后颠倒了月份和日期。请指定excel文件的正确工作方式。xlsx还是xls?@PilgerstorferFranz请再次阅读我的问题,所有问题都已解决。@PortlandRunner抱歉,已修复。请给我您的邮件地址或将其发送给我的:obibezfobi@gmail.com我会把这两份文件寄给你。看我的回答:弗兰兹。pilgerstorfer@gmx.atthanks真的谢谢,无论如何,这个错误的文件是由某个网站生成的,我把下载文件和xls文件下载了,所以我有点惊讶,这是html文件,无论如何,谢谢,真的谢谢。