【问题标题】:Ignored columns using vb6 to extract from excel使用vb6从excel中提取忽略的列
【发布时间】:2013-04-16 16:06:11
【问题描述】:

我正在尝试使用 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)并循环遍历结果时,我得到了 NullName9 的值, 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 行(不包括列名)时才会出现此问题,并且我为 MSDASQL 连接设置了 MaxScanRow=0,但这产生了相同的结果。

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

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

非常感谢您对此事的任何帮助!

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


谢谢大家!在尝试从KB155512 onedaywhen 的优秀post 以“编程方式”设置Schema.ini 的过程中,我指出了解决方案:

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

我会鼓励任何有类似问题的人阅读帖子和 cmets,因为解决方案因人而异。

【问题讨论】:

    标签: excel vb6 oledb adodb msdasql


    【解决方案1】:

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

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

    请参阅onedaywhen 的回答了解更多详情,我关于KB282263 的第一个信息不是正确的建议。

    【讨论】:

    • 您链接到的知识库文章适用于文本文件,而不是 Excel。 schema.ini 文件不能与 Excel 结合使用(这是一种耻辱)。
    【解决方案2】:

    您是对的:它是根据行数猜测数据类型。您可以更改本地计算机注册表项以影响所选数据类型。详情请见this answer

    【讨论】:

    • 至少我在球场上。 +1
    【解决方案3】:

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

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

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

    【讨论】:

    • 这个解决方案假定一个活跃用户,以及对用户环境的某种控制措施。情况可能并非如此,特别是如果 Excel 仅用作数据输入机制(例如,从各种输入人员那里收集 50 个电子表格)。诚然,可以将 VBA 包含在工作簿/工作表/模板中,但如果数据最终会存储在各种数据库中(例如,世界各地的复制数据库),情况就会变得更加复杂。此外,此解决方案假定 Excel 版本是同质的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多