首先,我想说我在这里深水,因为我只是对公司中其他人编写的代码进行了一些更改,使用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中显示为空白,但数字显示正常?还有其他具有字母数字内容的列显示得很好。
答案 0 :(得分:8)
正在发生的事情是,Excel正在尝试根据该列中的前几个值将数据类型分配给电子表格列。我怀疑如果你看一下那列中的属性,就会说它是一个数字列。
当您开始尝试使用jet查询该电子表格时,问题就出现了。当它认为它正在处理数字列并且它找到一个varchar值时,它会静静地返回任何内容。甚至不是一个神秘的错误信息。
作为一种可能的解决方法,您可以将其中一个字母数字值移动到第一行数据,然后尝试解析。我怀疑你会开始获取字母数字行的值...
看看this article。它详细介绍了这个问题。它还讨论了可能的工作:
但是,根据JET文档,我们 可以通过覆盖注册表设置 连接字符串,如果我们设置 IMEX = 1(作为扩展的一部分 属性),JET将设置全部 列类型为UNICODE VARCHAR或 ADVARWCHAR无论如何 'ImportMixedTypes'键值.hey
答案 1 :(得分:1)
IMEX=1
表示“将混合数据作为文本读取。”
有关详细信息,请参阅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/