"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"
上述连接字符串中IMEX=2
的目的是什么?
答案 0 :(得分:30)
“如果要将列标题读入结果集(使用HDR = NO,即使有标题)且列数据为数字,请使用IMEX = 1以避免崩溃。
始终使用IMEX = 1是检索混合数据列数据的更安全的方法。 ..“
请注意,当您需要将数据写回Excel时,IMEX值非常重要。 在IMEX上快速搜索互联网上发现了许多关于各种IMEX值问题的文章
答案 1 :(得分:12)
使用OleDbConnection读取Excel文件时可能存在问题。
如果您使用
"Extended Properties='Excel 8.0;HDR=NO;IMEX=3;'"
对于像下面这样的列,前8行有4个(或更多)数值, 然后该类型被认为是数字,字符串值被读为空。
请注意,标头在此处不用作标题(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
但是如果您的数据看起来像这样,那么只有3个是前8行的数字
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的工作原理)。
这种方法有一些缺点。两者都可以解决:
1)您不能通过名称(zipcode)引用列,但需要使用例如F7,具体取决于列的位置。
您可以通过确定邮政编码列的位置来解决此问题 (可以通过编程方式完成)并相应地更改SQL文本 将“zipcode”更改为例如“F7”。
2)“zipcode”值将出现在您的数据中。
这可以通过在where子句中使用F7&lt;&gt;'zipcode'来解决。一 可能会认为这会抵消我们所包含的事实 zipcode(是一个字符串),以确保所有行都被视为字符串。 经过测试后,事实证明是where子句 排除“zipcode”的技巧没有这样的抵消 效果。
答案 2 :(得分:0)
当您将excel文件读入数据表时,数据表会读取列值,在大约8-10条记录之后,它会将数据类型分配给列。例如,如果列值为
11.0
22.0
33.0
44.0
55.0
66.0
77.0
88.0
99.0
ABC
因此,数据表不会具有值abc,因为已为列分配了数据类型&#34; Double&#34;。为避免这种情况,并使用IMEX = 1读取完整数据
请评论进一步的询问。
答案 3 :(得分:-6)
请使用模块中的通用功能...
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