一、概述
在我们利用C++Builder进行报表设计和打印处理时,我们往往是用C++Builder自己所提供的QReport组件页中的组件进行报表的设计和输出。但这样输出的表格都是事先设计好,并且不容易修改的表格,在系统移植后和需要对表格进行修改时就显得非常麻烦。那么,有什么好的解决方法来实现既可以自动生成报表,同时有能够对生成的报表进行灵活地修改呢?
几乎每一个用过Miscrosoft Office 2000 中Word字处理软件的人都知道:Word是一个强大的文字、表格、排版处理软件。在Word中可以设置不同的字体、字号,绘制各种不同形状的表格……。Word强大的功能给我们在使用它的过程中留下了深刻的印象。
如果我们能将C++Builder中处理好需要生成为报表的数据导入到Word中;在Word中对生成的报表还可以修改、排版那该多好啊!答案是肯定的,我们能够在C++Builder中调用Word ,生成各种不同的报表。
二、实现
下面我们将用具体的实例来说明如何运用C++Builder调用Word进行报表的设计和制作。,我们在安装了C++Builder和Word后就可以进行应用程序的设计了,在安装C++Builder的过程中将选择当前您所使用的系统中Office的版本,C++Builder可以选择两种版本:Office2000版和Office97版。在我们所举的实例中都是在Office2000版下进行的。
(实例1)
以下的一个例子将详细地说明在C++Builder中如何调用Word并打印出一个字符串来。
步骤1 打开C++Builder开发平台,创建一个新的项目
步骤2 在C++Builder的组件面板中找到Office2K组件页,在这个组件页上我们可以看到如下组件:
在这里我们对这些组件中调用Word部分进行概括的说明:
WordGlobal 组件:对Word的最高级属性和方法进行调用。
WordApplication组件:Word应用程序组件,完成对Word应用程序的调用。是实现Word调用的核心组件。
WordDocument组件:Word文档处理组件,用于处理文档的具体内容。
WordFont组件:用于设置Word中的字体、字号等文字设置信息。
WordParagraphFormat组件:用于对Word中的段落格式进行处理。
WordLetterContent组件:对由信函向导创建的信函的元素进行调用的组件。
步骤3 在新项目的Form表单中添加一个WordApplication组件,将name属性改为: WordApp1。
步骤4 添加一个按钮组件到Form表单上将按钮的Caption属性设置为:“Word调用”
步骤5 双击按钮组件切换到代码编辑窗口,添加如下代码:
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();
}
步骤6 编译运行程序。这时,我们单击“Word调用”按钮就可以看到:Word程序自动运行,同时在Word中显示出一串字符串,整个程序的调用就完成了。
分析:
这是最简单的Word调用实例。下面,我们就来分析一下我们所输入的代码:
WordApp->Connect();
这一条语句是将我们的应用程序和Word进行连接,如果连接失败可能是因为没有安装Word或Word发生错误。因此,我们用 try... catch(...)... 语句来对可能产生的错误进行处理。
WordApp->Disconnect();
这条语句与上一条语句是进行相反的操作,如果您已经与Word进行了连接,那么这条语句就是断开与Word的连接。需要注意的是:如果您没有关闭Word程序,在C++Builder中运行该语句,则可能导致产生连接错误。
WordApp->Documents->Add();
这条语句是在Word中建立一个新的文档,由于Word是一个多文档的处理程序,因此我们可以建立多个文档来进行操作。文档间又由Document下的Item函数来区分的。例如在程序中我们使用了:
WordApp->Documents->Item(Variant(1))来返回一个具体文档的指针。
Range()函数是用来设置在文档中所操作文本的范围,如果Range()函数中没有任何参数,则表明在所有的范围内进行操作。我们利用Range返回的指针中Text属性写入一个字符串,在文档中就可以看到这个字符串了。
最后我们所做的工作就是将Word程序运行的结果显示出来。我们运用WordApp->Visible属性来实现。
(实例2)
在这个实例中,我们将更加深入地探讨C++Builder调用Word程序实现报表的方法。其中将包括字体的设置,段落的格式等操作。我们将在Word中输出三段文字其中第一段文字的字体设置为黑体并且居中、字号为二号字,第二段文字将字体设置为宋体五号字,第三段文字将居右并为宋体小五号字。
我们建立两个调用Word的对象,一个为WordApplication对象,另一个为WordDocument对象。对象的名称分别为:WordApp和WordDoc。
下面是整个程序的代码: 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();
} 分析:
在这段程序中我们使用了两个关于Word调用的组件,在WordDocument组件中我们运用ConnectTo函数与WordApplication相连接,通过这种连接就可以方便地使用WordDocument组件所提供的功能对Word的其中一个文档进行具体地操作。使我们更加方便地控制与修改我们所产生的报表。
在WordDocument组件的使用中,我们运用了Paragraphs来对Word中的段落进行操作,其中包括了段落中字体的设置和段落的排版式样等。由此可见C++Builder为我们提供了一个非常方便的Word调用组件来让我们实现Word的应用。
拓展:
如果我们需要对段落中的其中一部分进行字体的设置那应该怎么办呢?我们在刚才的程序中看到:对段落的字体进行设置的语句是这样的:
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=9; //将最后选择的字符的字体设置为9号字
(实例3)
这个实例将说明在C++Builder中调用Word绘制表格的方法,其中包括表格的生成、单元格的控制与操作等。下面的这段代码将实现在Word中绘制一个4乘8的表格。
WordDoc->Tables->Add(WordDoc->Range(EmptyParam,EmptyParam),4,8);
//在Word中添加一个表格
在这里我们调用了WordDocument对象中的Tables来实现表格的绘制。Add函数是添加一个表格。其中的参数为:表格添加在文档中的位置,表格行,表格列的数量。参数中EmptyParam为已定义的常量。如果我们需要将表格添加到整个文档的末尾,我们可以将这段代码改为:
WordDoc->Tables->Add(WordDoc->
Range(Variant(WordDoc->Range(EmptyParam,EmptyParam)->End-1),EmptyParam),4,8);
//在Word文档末尾添加一个表格
在表格中,我们如果需要对单元格进行操作,例如在第3行、第5列的这个单元格我们需要插入一段文本,则可以这样操作:
WordDoc->Tables->Item(Variant(1))->
Cell(Variant(3),Variant(5))->Range->Text=WideString("添加的文本");
其中,Item中的值为指定需要进行操作的表格。Cell中的值为指定表格中的单元格位置。
在表格中如果我们需要合并两个单元格可以对单元格进行如下操作:
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)单元格合并
在表格中如果我们需要拆分单元格则进行如下操作:
WordDoc->Tables->Item(Variant(1))->Cell(Variant(3),Variant(5))->
Split(Variant(2),Variant(3));
//将表格中(3,5)单元格拆分为2行3列的单元格
通过这个实例我们掌握了C++Builder中调用Word进行表格绘制的基本方法,同时对表格中单元格的基本操作也有了一定地了解。下面的实例是如何在Word中添加图像。
我们在Word中添加图像的基本方法是运用剪贴板来进行图像的添加的。我们先把图像复制到剪贴板然后在Word中粘贴就可以了。例如我们从数据库中存储的图像调入到Word中其代码如下:
DBImage->CopyToClipboard(); //图像复制到剪贴板
WordDoc->Sentences->Last->Paste(); //粘贴到Word中
小结:
关于在C++Builder中调用Office来进行数据、报表等处理的方法还有很多种。在这里我仅仅只是介绍了Word调用中常用到的几种调用方法,涉及到的范围还很小。我只是希望能够引起大家对程序开发感兴趣,运用C++Builder开发出更多、更好的应用程序来。