文件打开时读取Excel数据

时间:2012-10-15 09:59:06

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

几天前我问question但找不到足够的答案。我更多地分析了这个问题并决定创建一个新线程。如果我不应该,请让我知道或关闭这个问题。

我有一个 OPEN excel文件,其中包含日期格式的列,其中包含一些值,如6/22 / 2006,6 / 22/2006。我正在尝试使用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时,一切都运转良好。有什么帮助吗?我在互联网上找不到足够的帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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