我正在使用具有几年前制作的组件的遗留系统(Excel宏),我现在正尝试将其集成到更加用户友好的.net应用程序中。我访问的文件是以制表符分隔的数据表保存为 _ _。xls,因此双击时Excel会自动打开它们。
在工作表内,有各种日期格式为" dd / MM / yyyy",并且通过Excel 2003正常打开文件(双击,右键单击打开等)(所需版本) ),日期被解释为这样。当我尝试使用Microsoft.Office.Interop.Excel(14.0.4756.1000)库打开文件时,(即通过c#调用)使用以下语法:
eit_book = eit_books.Open(targetFile.FullName, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing);
日期的日期和月份已切换,并且在上述宏中完成的所有日期数学运算都不正确。 (以及日期大于12的任何日期甚至不被确认为日期)
即。 04/01/2012成为01/04/2012,这可能是因为系统的区域设置设置为"英语(美国)",但我已确保系统&# 39; s区域设置短日期格式设置为与电子表格中的数据匹配的自定义值(" dd / MM / yyyy"),并且只有在使用上面的代码。
非常感谢任何帮助。感谢。
编辑:打开文件的计算机的操作系统是Windows XP。
答案 0 :(得分:1)
您需要使用OpenText
方法打开文件才能指定日期格式。此外,Excel会记住您之前的首选项(打开文本文件或将文本转换为列时),因此必须明确指定大多数参数以获得可靠的结果。
我的示例文件是以3列分隔的制表符,但我只是指定第一列的日期格式。
我文件中的第一行文字是:
11/01/2001 12/01/2001 13/01/2001
OpenText方法不返回工作簿,因此我必须在之后通过名称检索它:
int[] dateColInfo = new int[] {1, (int)XlColumnDataType.xlDMYFormat};
object[] fieldInfo = new object[] {dateColInfo};
eit_books.OpenText(path, Type.Missing, 1, XlTextParsingType.xlDelimited, XlTextQualifier.xlTextQualifierDoubleQuote, false, true, false, false, false, false, Type.Missing, fieldInfo, Type.Missing, Type.Missing, Type.Missing, Type.Missing, false);
eit_book = eit_books.get_Item(name);
Range rng = eit_book.Worksheets.get_Item(1).range("A1");
Console.WriteLine("{0} ISO Date: {1}", rng.Value, ((DateTime)rng.Value).ToString("yyyyMMdd"));
dateColInfo[1] = XlColumnDataType.xlDMYFormat
时的输出:
11/01/2001 12:00:00 AM ISO Date: 20010111
dateColInfo[1] = XlColumnDataType.xlMDYFormat
时的输出:
1/11/2001 12:00:00 AM - ISO Date: 20011101