"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
IMEX=2
上述连接字符串的目的是什么?
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
IMEX=2
上述连接字符串的目的是什么?
“如果要将列标题读入结果集中(即使有标题也使用 HDR=NO)并且列数据是数字,请使用 IMEX=1 以避免崩溃。
始终使用 IMEX=1 是检索混合数据列数据的更安全方法。..”
请注意,当您需要将数据写回 Excel 时,IMEX 值可能非常重要。在互联网上快速搜索 IMEX 发现了许多关于各种 IMEX 值问题的文章
使用 OleDbConnection 读取 Excel 文件时存在潜在问题。
如果你使用
"Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"
对于像下面这样的列,其中前 8 行有 4 个(或更多)数值,则类型被认为是数值,字符串值被读取为 null。
请注意,此处未将标头用作标头(HDR = NO),因此“邮政编码”行是第一行。(这些邮政编码来自瑞典,以防您不认识它们的格式。)
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 13940
7) 181 55
8) 11759
9) 176 74
10) 137 38
但是如果您的数据看起来像这样,前 8 行中只有 3 个是数字
1) zipcode
2) 125 45
3) 115 50
4) 18735
5) 11335
6) 139 40 <-- This one changed so that it is a string
7) 181 55
8) 11759
9) 176 74
10) 137 38
然后它可以工作,它会以字符串的形式读取所有内容。
所以第一种情况是有问题的。但是有一个解决方案。
假设您使用
"Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'"
我们已将 IMEX 更改为 1 并将 HDR 更改为 YES,那么它将在上述两种情况下将数据读取为字符串。但是假设我们有这样的数据
1) zipcode
2) 12545
3) 11550
4) 18735
5) 11335
6) 13940
7) 18155
8) 11759
9) 17674
10) 137 38
那么前 8 个数据行都是数字的,然后它再次失败,即使我们有 IMEX=1。
您可以通过以下方式解决此问题。将连接字符串更改为此
"Extended Properties='Excel 8.0;HDR=NO;IMEX=1;'"
请注意,我们保持 IMEX=1,但将 HDR 改回 NO。
现在第 1 行不再被视为标题,“zipcode”被读取为数据,并且由于它显然是一个字符串,所有行都被读取为字符串(这就是 IMEX=1 的工作方式)。
这种方法有几个缺点。两者都可以解决:
您可以通过找出 zipcode 列的位置来解决这个问题(可以通过编程方式完成)并通过将“zipcode”更改为例如“F7”来相应地更改 SQL 文本。
这可以通过在 where 子句中使用 F7<>'zipcode' 来解决。有人可能会认为这会抵消我们包含邮政编码(作为字符串)以确保所有行都被视为字符串的事实。在对此进行测试之后,结果发现排除“邮政编码”的 where 子句技巧没有这种抵消作用。
当您将excel文件读入数据表时,数据表会读取列值,大约8-10条记录后,它将为列分配数据类型。例如,如果列值为
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
abc
因此,数据表将没有值 abc,因为该列已被分配数据类型“Double”。为避免这种情况,使用 IMEX = 1 读取完整数据。
请评论进一步查询。
请在模块中使用通用函数...
Public Function DeleteBlankRowsfromDataset(ByRef Dtset As DataSet) As Boolean
Try
Dtset.Tables(0).AsEnumerable().Where(Function(row) row.ItemArray.All(Function(field) field Is Nothing Or field Is DBNull.Value Or field.Equals(""))).ToList().ForEach(Sub(row) row.Delete())
Dtset.Tables(0).AcceptChanges()
DeleteBlankRowsfromDataset = True
Catch ex As Exception
MsgBox("Deleting Blank Records in Dataset Failed")
DeleteBlankRowsfromDataset = False
End Try
End Function