使用OleDbDataAdapter从Excel工作表中获取数据时出现问题

时间:2010-09-28 22:06:20

标签: c# excel jet oledbconnection

首先,我想说我在这里深水,因为我只是对公司中其他人编写的代码进行了一些更改,使用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中显示为空白,但数字显示正常?还有其他具有字母数字内容的列显示得很好。

3 个答案:

答案 0 :(得分:8)

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

当您开始尝试使用jet查询该电子表格时,问题就出现了。当它认为它正在处理数字列并且它找到一个varchar值时,它会静静地返回任何内容。甚至不是一个神秘的错误信息。

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

看看this article。它详细介绍了这个问题。它还讨论了可能的工作:

  

但是,根据JET文档,我们   可以通过覆盖注册表设置   连接字符串,如果我们设置   IMEX = 1(作为扩展的一部分   属性),JET将设置全部   列类型为UNICODE VARCHAR或   ADVARWCHAR无论如何   'ImportMixedTypes'键值.hey

答案 1 :(得分:1)

IMEX=1表示“将混合数据作为文本读取。”

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

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

  

查看位于[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel]的注册表REG_DWORD“TypeGuessRows”。这是不让Excel仅使用前8行来猜测列数据类型的关键。将此值设置为0可扫描所有行。这可能会影响性能。另请注意,添加IMEX = 1选项可能会导致IMEX功能仅在8行后设置。使用IMEX = 0来确保强制注册表TypeGuessRows = 0(扫描所有行)。

答案 2 :(得分:1)

如果您能提供帮助,我建议不要使用OleDb数据提供程序来访问Excel。我完全没有其他问题,因为其他人已经指出了原因。当您处理大型电子表格时,性能往往也很恶劣。

您可以尝试这种开源解决方案: http://exceldatareader.codeplex.com/