【问题标题】:Excel locale wrong time formatingExcel 区域设置错误的时间格式
【发布时间】:2014-02-23 09:57:13
【问题描述】:

我对 excel 有很奇怪的问题。我有两个文件,每个文件只有一列是日期,使用 c# 互操作库我打开每个文件并保存为 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 as 将这些 excel 保存为 csv 时,一切都很好。

【问题讨论】:

  • 您计算机中的区域日期设置是什么? excel 可能会混淆月份与日期。
  • BE-be ,但正如我所说,有两个 excel,一个还可以,另一个在保存到 csv 后将日期与月份反转。
  • 请指定哪个 excel 文件可以正常工作。 xlsx 还是 xls?
  • @PilgerstorferFranz 请再次阅读我的问题,一切都在那里。
  • @PortlandRunner 抱歉,已修复。

标签: c# excel


【解决方案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 文件并输入了一些日期(1.1.2014 到 31.1.2014 德语格式),然后将其保存为 .xls 文件。

运行我的代码时,两个文件在 dd/MM/yyyy 中创建了相同的结果。我也做了一些背景调查。

每当托管客户端调用 COM 对象上的方法并且它需要 为了传递特定于文化的信息,它使用 CurrentCulture (locale) 匹配当前线程语言环境。这 当前线程区域设置继承自用户的区域设置 默认情况下。

  • SO 中我发现了一个问答确定 Excel 语言,它显示了如何显示当前系统文化和 Excel 用户界面文化

检查这个sn-p

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 调用所有代码zh-CN

  • 其他人建议将每个单元格格式化为一定的数字格式(见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 格式。

【讨论】:

  • 请给我你的邮件地址或发给我:obibezfobi@gmail.com,我会把这两个文件发给你。
  • 看我的回答:franz.pilgerstorfer@gmx.at
  • 非常感谢,无论如何这个错误的文件是由某个网站生成的,我在其中放置了下载文件并下载了 xls 文件,所以我有点惊讶这是 html 文件,无论如何谢谢,真的谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2020-05-10
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多