35

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=localhost;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=2"

IMEX=2上述连接字符串的目的是什么?

4

4 回答 4

34

连接字符串

“如果要将列标题读入结果集中(即使有标题也使用 HDR=NO)并且列数据是数字,请使用 IMEX=1 以避免崩溃。

始终使用 IMEX=1 是检索混合数据列数据的更安全方法。..”

请注意,当您需要将数据写回 Excel 时,IMEX 值可能非常重要。在互联网上快速搜索 IMEX 发现了许多关于各种 IMEX 值问题的文章

于 2012-04-11T08:10:39.533 回答
20

使用 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 的工作方式)。

这种方法有几个缺点。两者都可以解决:

  1. 您不能按列的名称(邮政编码)引用列,但需要根据列所在的位置使用例如 F7。

您可以通过找出 zipcode 列的位置来解决这个问题(可以通过编程方式完成)并通过将“zipcode”更改为例如“F7”来相应地更改 SQL 文本。

  1. 值“zipcode”将出现在您的数据中。

这可以通过在 where 子句中使用 F7<>'zipcode' 来解决。有人可能会认为这会抵消我们包含邮政编码(作为字符串)以确保所有行都被视为字符串的事实。在对此进行测试之后,结果发现排除“邮政编码”的 where 子句技巧没有这种抵消作用。

于 2015-12-13T02:36:28.230 回答
1

当您将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 读取完整数据。
请评论进一步查询。

于 2015-08-20T14:48:27.323 回答
-8

请在模块中使用通用函数...

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
于 2015-10-12T17:59:00.530 回答