VC操作Excel2003,Word2003的两种方式
开发工具:vs2008+sp1
office:2003及一上版本(开发引入office11,实际使用软件office14)
在工作中很多次遇到需要操作office文件的内容,上网搜索查询资料,查到的大部分都是比较老的资料。大部分资料都是侧重于介绍功能的实现,却详细介绍开始环境的搭建,所以对初学者带来了很多困惑,特别是包含库的过程中经常遇到各种错误,如果同时使用excel,word,ado,那么问题可能更多。所以本文主要是介绍怎么把环境搭起来,不涉及到具体的操作。
office软件提供了com库给我们进行操作,vc操作com库有三种方式
1,使用com库函数
2,使用类向导导入类型库
3,使用#import命令
如果是我们自己写的库函数,可以使用第一种方式,所以我这里就介绍第二和第三种方式
使用类向导导入类型库
1、新建了MFC工程,添加类
2、添加需要的类
注意,我这里对类的名字进行重命名了,因为我这里还是准备要用到word的,这两个默认的名称都是CApplication,如果检测到重名了,就好自动加数字(CApplication0)。
如果是用以前的版本,默认的名称是excel,所有的类都是生成到一个文件里面的。2008默认是在单独的文件里面,当然也可以指定到同一个文件里,我自己试了一下,发现有的时候是成功,有的时候失败,不是很稳定,所有建议还是分开吧。
3、此时编译工程,就会报出很多错误,
error C2371: “FontPtr”: 重定义
error C2786: “BOOL (__stdcall *)(HDC,int,int,int,int)”: __uuidof 的操作数无效
error C2923: “_com_IIID”:“Rectangle”不是参数“<未知>”的有效 <未知> 类型变量
error C3203: “_com_IIID”: 未专用化的类 模板 不能用作 模板 变量,该变量属于 模板 参数“_IIID”,应为 real 类型
error C2504: “_IMsoDispObj”: 未定义基类
。。。。。。
超多的错误,我就不一一列举了
解决方法:在生成的文件里面,找到"C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace 删除掉就可以了。
ps:操作word的方法和excel是一样的,库文件是MSWORD.OLB
使用#import命令
1、新建工程,引入库
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE12\mso.dll" rename("RGB", "MSRGB")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, \
rename("Reference", "ignorethis")
#import "C:\Program Files\Microsoft Office\OFFICE11\excel.exe" exclude("IFont", "IPicture") \
rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis") \
rename("ReplaceText", "JOEReplaceText"), rename("CopyFile","JOECopyFile"), \
rename("FindText", "JOEFindText"), rename("NoPrompt", "JOENoPrompt")
#import "C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB" raw_interfaces_only \
rename("FindText","WordFindText") \
rename("Rectangle","WordRectangle") \
rename("ExitWindows","WordExitWindows") \
rename("Table","WordTable")
using namespace Office;
using namespace VBIDE;
2、编译,引入的库没有冲突,就可以使用了。
网上的资料介绍大部分为使用类向导的,不知这是由于之前不支持import方法,还是第一个人采用了类向导的方式,然后大家就互相抄来抄去。我个人认为采用import的方式比较好,用起来很方便。
参考资料:http://www.cnblogs.com/highmayor/archive/2008/01/18/1044108.html
示例代码下载