首先,我想说我在这里深水,因为我只是对公司中其他人编写的代码进行了一些更改,使用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正在尝试根据该列中的前几个值将数据类型分配给电子表格列.我怀疑如果你看一下那列中的属性,它会说它是一个数字列.
当您开始尝试使用jet查询该电子表格时,问题就出现了.当它认为它正在处理数字列并且它找到一个varchar值时,它会静静地返回任何内容.甚至没有一个神秘的错误消息.
作为一种可能的解决方法,您可以将其中一个字母数字值移动到第一行数据,然后尝试解析.我怀疑你会开始获取字母数字行的值然后......
看看这篇文章.它详细介绍了这个问题.它还讨论了可能的工作:
但是,根据JET文档,我们可以通过Connection String覆盖注册表设置,如果我们设置IMEX = 1(作为扩展属性的一部分),JET会将all列类型设置为UNICODE VARCHAR或ADVARWCHAR,而不管'ImportMixedTypes'关键价值.嘿