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

示例代码下载

使用类向导导入类型库

使用#import命令

原文地址:https://www.cnblogs.com/junyuz/p/3027910.html