"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),因此“zipcode”行是第一行。 (这些邮政编码来自瑞典,如果您不认识它们的格式。)
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。
现在第一行不再被视为标题,"zipcode"被读取为数据,并且由于它显然是一个字符串,所有行都被读取为字符串(这就是IMEX=1的工作原理)。
这种方法有一些缺点。但两个都可以解决:
您可以通过找出zipcode列位于哪里(可以通过编程方式完成)并相应地更改SQL文本,将"zipcode"更改为例如"F7"来解决此问题。
这可以通过在where子句中使用F7<>'zipcode'来解决。有人可能认为这会抵消包括zipcode(作为字符串)以确保处理所有行为字符串的事实。经过测试发现,排除"zipcode"的where子句技巧并没有这样的抵消效果。
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