【问题标题】:Reading excel data when the file is open打开文件时读取excel数据
【发布时间】:2012-10-05 06:55:56
【问题描述】:

几天前我问了question,但找不到足够的答案。我对问题进行了更多分析,并决定创建一个新线程。如果我不应该这样做,请告诉我或关闭问题。

我有一个 OPEN excel 文件,其中包含日期格式的列,其中包含一些值,例如 2006 年 6 月 22 日、2006 年 6 月 22 日。我正在尝试使用 OleDbDataReader 读取 excel。代码是这样的:

string sql = string.Format("SELECT * FROM [{0}]", excelSheetName);
internal OleDbCommand command = new OleDbCommand();
command.CommandText = sql;
OleDbDataReader oleRdr = command.ExecuteReader();

DataTable dataTable = new DataTable();
datatable.TableName = excelSheetName;
dataTable.Load(oleRdr);

我使用的连接字符串为:

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\ExcelData\sample.xls;Extended Properties='Excel 8.0;HDR=No;IMEX=1'";

问题是我无法以正确的 (DateTime) 格式读取日期值。我相信一切都被视为数字格式。所以我的结果是

6/22/2006 as 38890

在网上阅读了一些文章后,我了解到我的专栏有多种数据类型,然后我将连接字符串更改为:

string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\ExcelData\sample.xls;Extended Properties="Excel 8.0;HDR=No;IMEX=1;ImportMixedTypes=Text;TypeGuessRows=0"";

但我仍然无法以正确的格式读取 excel。对此有任何建议。在我看来这是一个奇怪的问题。如果我需要提供更多信息,请告诉我。

注意:还要注意,当我的 excel 文件关闭时,两个连接字符串都会给我正确的数据。对于新的文档格式.xlsx,我们使用的是Microsoft.ACE.OLEDB.12.0

编辑

我也尝试编辑注册表....但没有缓解。 但是当我更改值IMEX = 0IMEX = 1 时,它又可以正常工作了。任何人都可以准确地说出发生了什么吗?

编辑 2 当我更改 HDR=Yes 时,一切正常。请问有什么帮助吗?我在互联网上找不到足够的帮助。

【问题讨论】:

  • 我对编辑感到困惑。您无法使用 Jet.OLEDB 正确读取日期?。
  • 无论如何,您始终可以从整数中获取日期时间:DateTime.FromOADate(38890) ===> 6/22/2006(您可以尝试解析为整数以了解您是否正在阅读日期或 OLE 日期)
  • 我将这些日期时间值从 excel 获取到数据表,然后作为数据源传递到网格。这些是出于展示目的。此外....如果用户有一列包含一些数值和一些日期的混合列......您的方法会将所有内容转换为不正确的日期。我只想读取 excel 中存在的数据

标签: c# .net excel connection-string oledb


【解决方案1】:

所以我以一种不令人满意的方式解决了这个问题。我注意到我的分析和实验并最终得出结论,当 Excel 在 MS-Excel 中打开并且我们尝试使用 OleDbDataReader 在 C# 中读取 excel 时,一些 DataTypes 没有正确读取,不幸的是 DateTime 是其中之一就我而言。

作为一种解决方案,目前我们正在强制用户在读取 excel 文件时关闭 excel。我什至注意到,如果 Excel 在 MS-Excel 中以 Read-only 模式打开,那么所有 DataTypes 包括 DateTime 的读取数据都是正确。但是在Write-Mode打开时,读取的数据不正确

这些是我的分析结果,我知道/同意结果有点奇怪。如果有人不同意或有其他想法,请告诉我并请纠正我。

【讨论】:

  • 这里的帖子超级有用但晦涩难懂。我用来解决这个问题的其他方法:DateTime.TryParseExact、Integer.TryParse 和 DateTime.FromOADate。
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-30
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多