且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

VB 6.0中如何访问EXCEL 2007及EXCEL 2010

更新时间:2022-02-28 19:40:36

问题及分析过程


最近一段时间在使用VB 6.0开发一个OFFICE考试系统,理想的情况是支持WINDOWS XP,WINDOWS 7,WINDOWS 8,Office 2003和Office 2010。之所以,选择VB 6主要原因是使用VBA录制的宏可以经过简单精简即可应用于VB6程序中。另外,VB6的体积也小,而且其他几位老师都易于上手。

但是,在使用VB6导入EXCEL 2010数据时却发现了问题。直接的想法是,在窗体上添加一个ADODC控件,通过其属性设置来访问EXCEL 2010。于是,第一个想到的是使用Microsoft Jet 4.0 OLE DB Provider。但是,在测试连接时,总是出现错误提示“找不到可安装的ISAM”,相应的英文提示是“Could not find installable ISAM”。于是搜索了许多参考答案,但是由于例子中都是访问EXCEL 2003或者以下版本,始终找不到答案-总是出现上面的提示。根据有些网站提示,安装了最新的VB6的SP6,也根本无济于事。

最后,还是英文搜索帮了忙。在MSDN一个地方(http://social.msdn.microsoft.com/Forums/en-US/ae6f73a1-011f-4d8e-bcf5-80917e39ef97/could-not-find-installable-isam),描述如下:

“Jet OLEDB does not support Excel 2007 and Excel 2010 file formats. You need to install ACE OLEDB provider for it.”

这是微软的MVP给出的描述,自然错误可能性很小。循着这个思路和其中提供的链接(http://www.microsoft.com/en-us/download/confirmation.aspx?id=13255)。我下载并安装了其提供的Microsoft Access Database Engine 2010 Redistributable。

结果,也是令人失望。在VB6的ADODC属性链接对话框中根本没有出现上面一条,如下图所示:

VB 6.0中如何访问EXCEL 2007及EXCEL 2010


结合上述情况,我又使用中文搜索("VB 6.0如何访问EXCEL 2010"),终于在地址http://blog.sina.com.cn/s/blog_6e001be701016yi8.html找到比较明确的参考答案。当然,这个结论与上面那个MVP提供的信息是一致的。


结论

在VB6中目前不能通过ADODC控件方式借助JET引擎访问EXCEL 2010,即使安装了上述新的访问工具(这个工具是用于VB.NET访问新版本的EXCEL使用的)。但是,在上图中可以使用如图中所示的另外一种方式(Microsoft OLE DB provide for ODBC DRIVER)直接在ADODC控件中访问EXCEL 2010(我现在就使用了这种方式)。尽管花费了不少时间,终于有一个结果,还算欣慰一些……

[补充]

很遗憾很疑惑,我在通过代码使用ADODC控件访问EXCEL 2010时,还是出现错误。相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CommonDialog1.CancelError = False
    CommonDialog1.InitDir = App.Path & \"\\Data\"
    Me.CommonDialog1.Filter = \"Excel 2010(*.xlsx)|*.xlsx|Excel 2003(*.xls)|*.xls\"
    CommonDialog1.FilterIndex = 1
     
    CommonDialog1.ShowOpen
 
    \'e.g. \'single.xls\'
    strName = CommonDialog1.FileTitle
        Adodc1.ConnectionString = \"Provider=MSDASQL.1;Persist Security Info=False;Data Source=Excel Files;Initial Catalog=\" & App.Path & strName
        Adodc1.CommandType = adCmdText
        Adodc1.RecordSource = \"Select * from [Sheet1$]\"
         
        Adodc1.Refresh

运行过程中出现具体错误提示如下图所示(答案正在寻找中……)

VB 6.0中如何访问EXCEL 2007及EXCEL 2010


[问题解决]

其实,上面的表达方式基本没有问题,只是最后一句不能在此调用。典型情况下,上述代码应当是在Form_Load方法中调用的。于是,应当在Form_Activate方法中调用Adodc1.Refresh方法。如此,一切OK!

当然,如果你想使用Adodc1.CommandType = adCmdTable,那么Adodc1.RecordSource =”[Sheet1$]"也可以。

至此,问题解决!最终实现了使用VB6(+SP6)访问EXCEL 2010,对于EXCEL 2007虽然没有试验,但估计也是没有问题的!


[补充]

文章http://www.excelpx.com/thread-228696-1-1.html处提供了较细致的访问方法,只可以估计是针对VB.NET的方案,根本不适合VB6.














本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/1439674 ,如需转载请自行联系原作者