进行MS office自动化开发最好的工具或许是VBA,但是很多时候我们的应用系统往往和MS office的文件打交道,比如生成word文件和EXCEL报表等等,因此学习一下主流的开发工具关于MS office自动化的知识还是很有必要的。从今天起,我将推出一些基于VS 2005环境的MS office自动化开发的一些入门文章。第一篇是关于熟悉开发环境。
这次我使用的是VS C++ 2005。经过一番折腾,我感觉VS C++ 2005对MS office自动化开发的支持还比不上VC 6.0。我这么说是有根据的,因为基于VC 6.0和基于VS 2005环境的MS office自动化开发我都做过。在VC 6.0,你只需要找到TpyeLib那个dll文件(或tlb文件、olb文件),选择你要用的类,然后VC 6.0为你自动生成.h文件和.cpp文件,这样你就可以直接使用其中定义的类了。
我原以为VS C++ 2005会沿用VC 6.0的做法。但我发现VS C++ 2005采用了新的做饭,这也倒没什么,问题严重的是这种新的方式居然对MS office自动化开发支持比较的糟糕(Word操作部分)。
进行MS office自动化开发,做法基本都是选择MS office的组件,然后导出你要使用的接口类,这在VC 6.0和VS C++ 2005都是一样。下面我以一个简单例子说明一下VS C++ 2005的具体做法,对应的ms office版本是office 2003。
首先用VS 2005新建一个单文档工程Owner,然后为工程添加一个类,选择“TypeLib中的MFC类”,具体如下图:
单击“添加”按钮后出现下图,从下图我们看出VS 2005比VC 6.0的一点进步,这里多了一个导出来源:注册表。注册表的好处是名字直观,否则比如选择文件,你要操作word,你还要费一番心思去搜索操作word的类到底藏在哪个dll文件或olb文件、或tlb文件之中呢?
基于顾名思义的原则,我们在可用的类型库中选择Micro Word 11.0 Object Library<8.3>。这时出现一大堆接口类,我们也不知道该用哪个,干脆一古脑把它们全导入进来,具体如下图:
单击“完成”按钮后,你可以发现工程在一时之间出现了一大堆.h文件:CAddIn.h、CAddIns.h……你可能会疑惑,对应的cpp文件呢?对不起,VS 2005并没有为你生成。这时你或许感受到VS 2005和VC 6.0在office自动化开发的一点区别了吧。
既然一夜之间来了那么多新丁,先编译一下吧,OK,编译通过,这时你会说:VS 2005和VC 6.0的做法也不过大同小异罢了。先别那么早下结论,开始编码:
CApplication app;
先编译一下,这时出现了一些你想象不到的编译错误:
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2786: “BOOL (__stdcall *)(HDC,int,int,int,int)”: __uuidof 的操作数无效
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2923: “_com_IIID”:“Rectangle”不是参数“_Interface”的有效模板类型变量
1> c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h(3514) : 参见“Rectangle”的声明
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C3203: “_com_IIID”: 未专用化的类模板不能用作模板变量,该变量属于模板参数“_IIID”,应为real 类型
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(7113) : warning C4003: “ExitWindows”宏的实参不足
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(7113) : error C2059: 语法错误: “常量”
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(13448) : error C2146: 语法错误: 缺少“;”(在标识符“Fonts”的前面)
1> f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(13448) : error C4430: 缺少类型说明符- 假定为int。注意: C++ 不支持默认int
这时你可能会大呼:My God!这是怎么回事?抱歉,我也不知道为什么会出现这种问题。我初步估计为VS C++ 2005对MSWORD.olb这个组件支持得并不好,对其它一些组件可以支持。在这里我提供一个解决方案。在CApplication.h中将系统自动生成的:
注释掉。然后添加如下代码:
#import "c:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.olb"
#import "c:\Program Files\Microsoft Office\Office11\MSWORD.olb" \
rename("ExitWindows","_ExitWindows")
#import "c:\Program Files\Microsoft Office\Office11\EXCEL.exe" \
rename("DialogBox","_DialogBox") \
rename("RGB","_RGB") \
exclude("IFont","IPicture")
这样做之后再选择“重新生成”重新编译整个工程就可以顺利使用CApplication类了(注意是重新生成),尽管还有一些警告。
另外在每次编译时不时出现下面这个讨厌的对话框:
我还没找到办法去掉这个对话框。