c# - 在由 c# 调用的 Excel 中打开的制表符分隔文件未正确将文本解释为日期

标签 c# vba date excel

我正在使用一个遗留系统,该系统具有几年前制作的组件(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,这大概是因为系统将其区域设置设置为“英语(美国)”,但我已确保系统的区域设置短日期格式设置为与电子表格中的数据匹配的自定义值(“dd/MM/yyyy”),并且问题似乎只在使用上面的代码打开工作表时出现。

如有任何帮助,我们将不胜感激。谢谢。

编辑:打开文件的电脑操作系统是Windows XP。

最佳答案

您需要使用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

关于c# - 在由 c# 调用的 Excel 中打开的制表符分隔文件未正确将文本解释为日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22510475/

相关文章:

sql - 更改 '.CommandText' 不会添加新列

date - 使用 ISO 8601 表示法创建自定义 SAS 日期时间格式

Mysql SELECT 在时间限制内只返回列匹配的最近和下一个最近的行

c# - cdata-section-elements 不工作

c# - ASP.NET:在资源管理器中重定向时 session 状态未更新

c# - 如何在 xamarin 或 c# 或 python 中检测图像中的所有分隔线?

javascript - 使用 moment js 将 iso 8601 格式化为 "MMM"和 "hourPM/AM"

c# - 静态类的竞争条件?

excel - 将对象插入 Excel 工作表

regex - 在 VBA 中返回正则表达式匹配(excel)