使用OleDbDataAdapter从Excel工作表中获取数据的问题

首先,我想说我在这里深深地感到,因为我只是对公司的其他人编写的代码进行一些更改,使用OleDbDataAdapter与Excel“交谈”,而我并不熟悉接着就,随即。 有一个错误,我不能遵循。

我想用一个OleDbDataAdapter来读取大约450行的Excel文件。

在代码中,它是这样做的:

connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source='" + path + "';" + "Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1;\""); connection.Open(); OleDbDataAdapter objAdapter = new OleDbDataAdapter(objCommand.CommandText, connection); objAdapter.Fill(objDataSet, "Excel"); foreach (DataColumn dataColumn in objTable.Columns) { if (dataColumn.Ordinal > objDataSet.Tables[0].Columns.Count - 1) { objDataSet.Tables[0].Columns.Add(); } objDataSet.Tables[0].Columns[dataColumn.Ordinal].ColumnName = dataColumn.ColumnName; objImport.Columns.Add(dataColumn.ColumnName); } foreach (DataRow dataRow in objDataSet.Tables[0].Rows) { ... } 

除了一件事以外,一切似乎都很好。 第二列大部分是四位数字,如6739,3920等,但是fice行有像8201NO和8205NO这样的字母数字值。 这五个单元被报告为具有空白内容而不是其字母数字内容。 我已经检查了excel,并且此列中的所有单元格都标记为文本。

这是一个xls文件,而不是xlsx。

有没有人有任何线索,为什么这些单元格显示为DataRow中的空白,但数字的显示是好的? 还有其他列显示字母数字内容,显示得很好。

发生什么事情是,Excel正试图根据该列中的前几个值将数据types分配给电子表格列。 我怀疑,如果你看看那个列的属性,它会说这是一个数字列。

当您开始尝试使用jet查询电子表格时,问题就出现了。 当它认为它正在处理一个数字列,并且它发现一个varchar值时,它悄无声息地返回任何东西。 甚至没有一个隐晦的错误消息去掉。

作为一种可能的解决方法,您可以将其中一个字母数字值移到第一行数据,然后尝试parsing。 我怀疑你会开始获取字母数字行的值,然后…

看看这篇文章 。 它在这个问题上更详细。 它还谈到了一个可能的工作是:

但是,根据JET文档,我们可以通过连接string覆盖registry设置,如果我们设置IMEX = 1(作为扩展属性的一部分),则JET将把所有列types设置为UNICODE VARCHAR或ADVARWCHAR,而不pipe“ImportMixedTypes”关键的价值

IMEX=1表示“以文本forms读取混合数据”。

有一些陷阱,但是。 Jet将只使用几行来确定数据是否混合,如果是这样的话,这些行都是数字的,你将会得到这种行为。

有关详细信息,请参阅connectionstrings.com :

查看位于registryREG_DWORD “TypeGuessRows”的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel] 。 这是不让Excel使用前8行来猜测列数据types的关键。 将此值设置为0以扫描所有行。 这可能会损害性能。 另请注意,添加IMEX = 1选项可能会导致IMEXfunction在8行之后设置。 使用IMEX = 0来确保强制registryTypeGuessRows = 0(扫描所有行)工作。

我会build议不要使用OleDb数据提供程序的东西来访问Excel,如果你能帮助它。 除了问题之外,我什么都没有,因为别人指出的原因。 在处理大型电子表格时,性能往往也是非常糟糕的。

你可以试试这个开源解决scheme: http : //exceldatareader.codeplex.com/