我对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时,一切都很好。
答案 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(区域设置)。该 当前线程区域设置继承自用户的区域设置 默认情况下。
检查此代码段
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格式。