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/archive/2013/04/18/3027910.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘要:当用户需要对报表需要重新编辑的时候,用Excel或者Word生成报表就会比XML或者HTML的方式更加合理。但是由于Word的组件在使用时候要导入很多类,如果直接加在工程中会使其看上去很乱,所以封装到DLL中是个不错的主意。本文在前人经验指导下对一些常用的操作做了简单的封装,功能由从DLL中导出类CWordOperate提供。 关键字:Word2003,MFC扩展DLL,报表,CWordOperate 一、 鉴于www.vckbase.com中已经有文章对vc使用word生成报表方式做详细的论述,这里不准备对此赘述。仅仅介绍封装类CWordOperate中的函数和DLL的使用。#include "msword.h"class AFX_EXT_CLASS CWordOperate {public: CWordOperate(); virtual ~CWordOperate(); BOOL CreateWordApp(BOOL bShow); // 创建一个word应用程序 void DeleteApp(); // 用后,删除 void ShowApp(BOOL bShow); // 显示,或者隐藏 void QuitApp(); // 关闭外部打开的word应用程序 BOOL NewDoc(CString tpName); // 根据模板创建文档 void SaveDoc(CString Filename); // 保存文档到文件路径 void TypeText(CString Text); // 在当前位置输入文字 void SetTextAlign(int val); // 设置文字对齐方式 void SetTextColor(COLORREF cr); // 设置文本颜色 void AddPic(CString FileName); // 在当前位置插入图片文件 void RunMacro(CString macroName); // 运行一个宏 void AddTable(int nRow, int nCol); // 加一个几行几列的表格 void AddTable(int nRow, int nCol, int autoFit); // 加一个几行几列的表格,列宽度自动 void SelectTable(int i); // 选择当前文档中的第i个表格 void MoveToTableNext(int iTable); // 把选择区指向表格后面 void SetCellText(int iTable, int iRow, int iCol, CString text); // 设置第i个表格中的某行某列的文字 void SetTableTextVAlign(int iTable, int val); // 置第i个表格中文字对齐方式 void SetColWidth(int iTable, int iCol, float width); // 设置列宽度 void SetRowHeight(int iTable, int iRow, float height); // 设置行高度 // 合并两个单元格之间的区域 void MergeCell(int iTable, int cell1Row, int cell1Col, int cell2Row, int cell2Col, CString text); // 设置单元格文本颜色 void SetCellTextColor(int iTable, int iRow, int iCol, COLORREF cr); // 设置单元格背景颜色 void SetCellColor(int iTable, int iRow, int iCol, COLORREF crCell); // 设置单元格边框的四周风格, void SetCellBorderStyle(int iTale, int iRow, int iCol, int sTop, int sLeft, int sBottom, int sRight); // 设置两个单元格之间的区域,边框的四周风格, void SetCellsBorderStyle(int iTable, int iRow1, int iCol1, int iRow2, int iCol2,int sTop, int sLeft, int sBottom, int sRight); // 设置两个单元格之间的区域,背景颜色 void SetCellsColor(int iTable, int iRow1, int iCol1, int iRow2, int iCol2, COLORREF crCell); CString ToString(); protected: _Application app; // 应用程序 Selection sel; // 用来存放获得的选择范围 _Document saveDoc; // 当前活动文档 COleVariant vTrue; // 常量TRUE COleVariant vFalse; COleVariant vOpt;};二、使用DLL中导出类的方法:#include "WordOperate.h"#pragma comment(lib, "wordDll.lib")在类中定义成员: CWordOperate wordFile;使用示例:// 创建文件 CString str;COLORREF crCell = RGB(240, 240, 240);char buffer[255];wordFile.CreateWordApp(TRUE);GetCurrentDirectory(254, buffer);strcat(buffer, "\\tp.doc");wordFile.NewDoc(buffer); // 表格使用wordFile.AddTable(8, 11);wordFile.SelectTable(1);wordFile.MergeCell(iTable, 1, 6, 1, 8, "频域数据");crCell = RGB(255, 0, 0);wordFile.SetCellColor(iTable, 3, 2, crCell);wordFile.MoveToTableNext(1);// 写文字wordFile.TypeText("二. 分析图:\r\n");// 插入图片GetCurrentDirectory(254, buffer);strcat(buffer, "\\chart.jpg");wordFile.AddPic(buffer);// 保存文件,删除对象GetCurrentDirectory(254, buffer);strcat(buffer, "\\测试报表.doc");wordFile.SaveDoc(buffer);wordFile.DeleteApp();// 也可以在删除对象前先关闭程序wordFile.QuitApp();三、使用压缩包的测试程序,按钮二能提供的效果如下图:图一 Word报表效果屏幕截图四、说明:开发环境为:vc6 + sp6 + xp_sdkWord版本:2003企业版压缩包说明:wordDll为库的代码,TestDll为使用示例,宏.txt是格式化段落的宏附加:如果想知道函数中使用的值应该为多少,可以在Word操作的时候录制宏,然后使用单步调试的方式得到想要的值。注:本着开源的精神,把这个使用过的类和大家分享,希望大家有用,如果有错误的地方,希望指正,谢谢

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值