0

我正在尝试使用 vb6 从 excel (2003) 电子表格中提取值表,其结果需要存储在 (adodb) 记录集中。该表如下所示:

    名称 Option.1 Option.2 Option.3 Option.4 Option.5 Option.6
    -------------------------------------------------- ---------------
    姓名1 2 3 4
    姓名2 2 3 4
    姓名3 2 3 4
    姓名4 2 3 4
    姓名5 2 3 4
    姓名6 2 3 4
    姓名7 2 3 4
    姓名8 2 3 4
    姓名9 2 3 4 5 6 7  

在连接并执行查询“ SELECT * FROM [Sheet1$]”甚至是特定于列的“ SELECT [Option#6] FROM [Sheet1$]”(参见脚注 1)并循环遍历结果时,我得到Null的是 row 的值Name9-- Option.4>Option.6而不是正确的值 5、6 和 7 .似乎与电子表格的连接正在使用“最佳猜测”来确定有效的表限制是什么,并且只考虑了一组行数。

要连接到电子表格,我尝试了两个连接提供程序Microsoft.Jet.OLEDB.4.0MSDASQL遇到了同样的问题。

以下是我使用的连接设置:

Set cn = New ADODB.Connection
With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & filePath & ";Extended Properties=Excel 8.0;"
    - - - - OR - - - - 
    .Provider = "MSDASQL"
    .ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};" & _
                        "DBQ=" & filePath & ";MaxScanRows=0;"
    .CursorLocation = adUseClient
    .Open
End With  
Set rsSelects = New ADODB.Recordset
Set rsSelects = cn.Execute("SELECT [Option#5] FROM " & "[" & strTbl & "]")

仅当行数超过 8 行(不包括列名)时才会出现此问题,并且我已MaxScanRow=0MSDASQL连接设置,但这产生了相同的结果。

我包括的值得注意的项目参考是:

  • MS ActiveX 数据对象 2.8 库
  • MS ActiveX 数据对象 Recordset 2.8 库
  • MS Excel 11.0 对象库
  • MS 数据绑定集合 VB 6.0 (SP4)

在这件事上的任何帮助将不胜感激!

(1) 出于某种原因,当列名中包含小数点时,它被解释为#。


谢谢大家!Schema.ini在尝试从KB155512 onedaywhen的“以编程方式”设置“程序化”的过程中,出色的帖子将我指向了解决方案:

.Provider = "Microsoft.Jet.OLEDB.4.0"
.ConnectionString = "Data Source=" & filePath & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"

我会鼓励任何有类似问题的人阅读这篇文章和评论,因为从一个人到另一个人的解决方案略有不同。

4

3 回答 3

3

默认情况下,Excel ISAM 驱动程序会查看您的前几行并猜测它们的数据类型。如果有(表中后面的)数据不符合初始假设,它会皱眉并将其变为 NULL。

您的MaxScanRows=0设置是解决此问题的关键。听起来它会做正确的事情(扫描整个表以查找要使用的数据类型),但实际上并没有。

有关更多详细信息,请参阅onedaywhen的答案,我关于KB282263的第一个信息不是正确的建议。

于 2008-10-23T12:00:54.810 回答
1

你是对的:它是根据行数猜测数据类型。您可以更改本地计算机注册表项以影响所选数据类型。有关更多详细信息,请参阅此答案

于 2008-10-23T13:31:15.187 回答
0

我能给你的最好的建议是停止在 VB6 环境中这样做。打开 Excel,按 ALT+F11 并加载 VBA IDE。把你的代码放在那里。在此环境中,您可以访问完整的 Excel 对象模型。

我见过很多人尝试以多种不同方式与 Excel 进行交互,但他们都遇到了问题。我发现使用 VBA 宏或加载项方法是获取数据的最佳方法。这就是微软如何让 Excel 和 Project 与 TFS 集成。

有时您需要重新考虑该过程以使这种方法适合。例如,您可能需要让正在使用电子表格的用户运行一个宏,该宏会将数据从电子表格中推出,而不是您运行一个进程从电子表格中提取数据,但通常这是非常可行的。

于 2008-10-23T13:05:28.673 回答