实验技术报告Word2010 [C++ Builder 6.0基于OLE技术对Word 2000的调用]
摘要:采用可视化设计工具C++Builder开发基于C/S架构的自动组卷系统,既要利用C++ Builder强大方便的数据库开发功能,又要利用Word强大的数据处理能力。本文在C++Builder基于OLE技术对Word 2000的调用方面进行了一些有益的探索,可以较为便捷地实现试题库系统试题的导入和导出。
关键词:OLE;试题库;自动组卷系统;C++ builder;Word 2000
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)17-31661-02
Calling Word 2000 from C++ Builder Based on OLE Technology
SHEN Hua
(Embedded System Engineering Department, Neusoft Institute of Information, Dalian 116023, China)
Abstract: The Auto-forming Test Paper System based on C/S architecture is developed with visual designing tool C++ Builder. Not only is the powerful data processing ability of C++ Builder used, but the powerful data processing ability of word is also used. Some useful studies of calling Word 2000 form C++ Builder based on OLE Technology have been done in this paper. It is convenient to import/export test questions from Test Question Data Base.
Key words: OLE; Test Question Data Base; Auto-forming Test Paper System; C++ Builder; Word 2000
1 引言
C++ Builder 6.0是Inprise公司推出的基于C++语言的可视化开发环境,不仅具有新颖的可视化设计工具,还配有数据库引擎,可以通过SQL连接或ODBC访问多种数据库,并具有开发基于Client/Server模式的数据库应用程序的能力。当进行数据库软件开发时i,有时需要进行大量的文档编辑或者严格的格式编排,C++Builder就会显得力不从心。而利用Word的强大的文档处理功能,可以解决C++ Builder 自带文本编辑功能少的缺陷。
C++ Builder调用Word常用的方法有两种:一种是利用OLE技术调用Word。OLE(对象的连接和嵌入)是微软公司提出的标准,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。第二种是利用ODBC数据库技术调用Word。第一种方法比较简单、方便,本文介绍的就是第一种方法。
2 自动组卷系统开发背景描述
随着办公自动化在教学中的应用推广,传统的命题方法既不能保证客观,又不利于资源的复用和共享。因此开发基于知识库和题库的自动组卷系统对于提高命题的客观率和知识的覆盖率具有明显的意义。自动组卷系统由前端的试卷管理系统和后台的知识数据库和试题数据库组成,管理员可以对后台数据库进行添加、删除、修改、查询等操作,试题输出由C++Builder调用Word进行文档的编排和打印。
传统的利用C++Builder进行报表设计和打印处理,往往是用C++Builder自己所提供的QReport组件页中的组件进行报表的设计和输出。但这样输出的报表都是事先设计好,并且不容易修改的表格,在系统移植后以及需要对表格进行修改时就显得非常麻烦。那么,有什么好的解决方法来实现既可以自动生成报表,同时又能够对生成的报表进行灵活地修改呢?
众所周知,Word能够很方便地对数据和报表进行修改和排版,如果能将C++ Builder中处理好的需要生成为报表的数据导入到Word中,那就可以解决试题信息的编辑和排版问题了。为此,研究在C++Builder中基于OLE技术调用Word ,生成各种用户需要的报表就显得很有实际意义。
3 C++Builder中调用Word的方法及实例介绍
要在C++ Builder应用程序中控制Word 2000的运行,首先必须在编制户程序时在其头文件包含Comobj.hpp和Utilcls.h。
即:#include
#include
另外,在C++Builder的组件面板中找到Office2K组件页,在这个组件页上可以看到如下组件:
WordGlobal组件:对Word的最高级属性和方法进行调用。
WordApplication组件:Word应用程序组件,完成对Word应用程序的调用。是实现Word调用的核心组件。
WordDocument组件:Word文档处理组件,用于处理文档的具体内容。
WordFont组件:用于设置Word中的字体、字号等文字设置信息。
WordParagraphFormat组件:用于对Word中的段落格式进行处理WordLetterContent组件:对由信函向导创建的信函的元素进行调用的组件。
以上这些组件的具体应用方法参考下面这些实例:
3.1 C++Builder中应用程序和Word的连接
准备工作:在新项目的Form表单中添加一个WordApplication组件,将name属性改为WordApp。
范例代码如下:
try
{ WordApp->Connect();//与Word进行连接
WordApp->Documents->Add(); //建立一个新文档
WordApp->Documents->Item(Variant(1))->Range()->Text=
WideString("这是第一个Word调用程序");
//在文档中添加一段新文本WordApp->Visible=true;
//显示Word
}
catch(...)
{ShowMessage("连接Word失败!");
WordApp->Disconnect();
}
代码说明:
(1)WordApp->Connect();
这一条语句是将当前的应用程序和Word进行连接,如果连接失败可能是因为没有安装Word或Word发生错误。因此,可用 try... catch(...)... 语句来对可能产生的错误进行处理。
(2) WordApp->Documents->Add();
这条语句是在Word中建立一个新的文档,由于Word是一个多文档的处理程序,因此可以建立多个文档来进行操作,文档间又由Document下的Item函数来区分的。
(3) Range()函数是用来设置在文档中所操作文本的范围,如果Range()函数中没有任何参数,则表明在所有的范围内进行操作。
3.2 C++ Builder调用Word程序实现文档的编辑
try{
WordApp->Connect();//连接Word
WordApp->Documents->Add(); //建立一个新文档
WordDoc->ConnectTo(WordApp->Documents->Item(Variant(1)));
//将WordDocument对象与WordApplication对象进行连接
WordDoc->Paragraphs->Add();//添加一个段
WordDoc->Paragraphs->Item(Variant(1))->Range->Font->Name=
WideString("黑体");//设置该段文本字体
WordDoc->Paragraphs->Item(Variant(1))->Range->Font->Size=20;//设置字号
WordDoc->Paragraphs->Item(Variant(1))->Range->Text=
WideString("这是第一段文字!");//当前段文字
WordDoc->Paragraphs->Item(Variant(1))->Alignment=1;
//设置该段文字居中WordDoc->Paragraphs->Add();//添加一个段
WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Name=
WideString("宋体"); //设置该段文本字体
WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Size=12;//设置字号
WordDoc->Paragraphs->Item(Variant(2))->Range->Text=
WideString("这是第二段文字!"); //当前段文字
WordDoc->Paragraphs->Item(Variant(2))->Alignment=0;
//设置该段文字居左
WordDoc->Paragraphs->Add(); //添加一个段
WordDoc->Paragraphs->Item(Variant(3))->Range->Font->Name=
WideString("宋体");//设置该段文本字体
WordDoc->Paragraphs->Item(Variant(3))->Range->Font->Size=10;//设置字号
WordDoc->Paragraphs->Item(Variant(3))->Range->Text=WideString("这是第三段文字!"); //当前段文字
WordDoc->Paragraphs->Item(Variant(3))->Alignment=2;
//设置该段文字居右
WordApp->Visible=true;}
catch(...)
{ShowMessage("您可能没有安装Word!");
WordApp->Disconnect();}
代码说明:
(1)在这段程序中使用了两个关于Word调用的组件,在WordDocument组件中运用ConnectTo函数与WordApplication相连接,通过这种连接就可以方便地使用WordDocument组件所提供的功能对Word的其中一个文档进行具体地操作,更加方便地控制与修改所产生的报表。
(2)在WordDocument组件的使用中,运用了Paragraphs来对Word中的段落进行操作,其中包括了段落中字体的设置和段落的排版式样等。
从这个实例可以看出C++Builder提供了一个非常方便的Word调用组件来实现Word的应用。
3.3 高级应用拓展
如果需要对段落中的其中一部分进行字体的设置那应该如何实现?从上面的程序中可以看到:对段落的字体进行设置的语句如下:
WordDoc->Paragraphs->Item(Variant(2))->Range->Font->Size=12;
假如要设置段落中第5个字符为9号字,就需要限制字体设置的范围,程序代码如下:
WordDoc->Paragraphs->Item(Variant(2))->Range->Select();
//将第二段文字选择上
WordApp->Selection->Start=WordApp->Selection->Start+5;
//在选择的范围中的第5个字符作为选择的开始字符
WordApp->Selection->End=WordApp->Selection->Start+1;
//将选择的结束字符设置为开始字符加1个字符
WordApp->Selection->Font->Size=16;
//将最后选择的字符的字体设置为16号字
3.4C++Builder中调用Word绘制表格
WordDoc->Tables->Add(WordDoc->Range(EmptyParam,EmptyParam),4,8);
//在Word中添加一个4×8的空白表格
WordDoc->Tables->Add(WordDoc->
Range(Variant(WordDoc->Range(EmptyParam,EmptyParam)->End-1),EmptyParam),4,8);
//在Word文档末尾添加一个4×8的空白表格
WordDoc->Tables->Item(Variant(1))->
Cell(Variant(3),Variant(5))->Range->Text=WideString("添加的文本");
//在第3行、第5列的这个单元格插入一段文本
WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
Marge(WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(6))); //将表格中(3,5)与(3,6)单元格合并
代码说明:
(1)在C++Builder中调用Word绘制表格,可以通过调用WordDocument对象中的Tables来实现表格的绘制,Add函数是添加一个表格。
(2)Item中的值为指定需要进行操作的表格,Cell中的值为指定表格中的单元格位置。
4 结束语
以上所介绍的C++ Builder基于OLE技术对Word 2000的调用已应用于自动组卷系统中,经测试运行良好,使用方便,功能强大,既利用了C++ Builder 强大的开发数据库软件的功能,又利用了Word 2000强大的文档处理功能和格式编排功能,使组卷系统使用起来更加的快捷方便。诚然,C++Builder中基于文档处理的组件还有很多其他的应用,本文只是针对开发自动组卷系统中涉及到的一些基础应用进行了探索,其他的高级应用还有待在将来的应用中继续研究。
参考文献:
[1]朱时银.C++ Builder 5.0编程实例与技巧[M].机械工业出版社,2001.
[2]魏俊鹏,于秋生.C++ Builder 6.0实用编程100例[M].中国铁道出版社,2004.
[3]Ken Getz, Mike Gilbert.VBA高级开发指南[M].电子工业出版社,2000.
