用Delphi4.0直接控制Word97

I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
一、前 言
 
  玩过 PowerBuilder的朋友一定知道, PB中最重要的技术就是它的 DataWindow技术,用它来设计表单、处理数据录入、设计报表十分方便。然而 Delphi的报表支持功能远不及 PB。 Delphi的专业版中包括了 QuickReport,不过它是集合由 QSD AS(一家挪威公司)授权的报表组件。当然,我们也可以使用外部报表工具,如 ReportSmith或 Cristal Report。不过控制稍嫌复杂,并且它们与 Delphi之间缺少集成性。
  我们在开发 《公文管理系统》网络版时,在实现公文打印时,尝试过不同的方法来实现。我们的要求是将一篇普通公文按公文格式打印出来,而用户能对其进行排版进行一些简单的控制。小辉刚开始是用的 QuickReport来试的,效果很不尽人意,特别是对一些中文格式的支持方面;后来小辉一不作二不休,干脆自己手工编写打印程序,不依赖设计工具,只可惜小辉技术不到家,写到一半时玩不下去了,只好另找出路。正好那天来了份 《中国计算机报》,上面有一篇介绍如何在 VB中使用 Excel的文章。小辉一想:何不用 Delphi将数据发送到 Word,由 Word来完成编辑排版工作呢?说穿了,就是用 OLE自动化技术。
  小辉一试,效果竟还可以。——虽然对于一个程序员来说,自己编的程序中要挂接一个别人的应用程序才能完全实现自己的功能,就象鸡群里插只鸭,心里总有点那个。但由于开发任务紧,主任又隔三隔四的来催,虽然最终有点不伦不类,小辉也顾不得那么多了。好了,废话少说,看看是怎样实现的吧——
二、窗体设计
 
  说穿了其实很简单。小辉在这里做了一个简单的示例程序:
   1. 设置窗体 Form1的 Font.name为‘宋体’, Font.size为 12;
   2. 窗体上依次放置 lable1-labe5五个 tLable控件,其 caption属性分别为‘文号’、‘标题’、‘收文单位’、‘正文’、‘发文单位’
   3. 在窗体上依次放置 tEdit、 tEdit、 tEdit、 tMemo、 tEdit五个编辑控件,其 name属性分别为 :ED_WenHao、 ED_BiaoTi、 ED_ShouWenDanWei、 ED_ZhenWen、 ED_FaWenDanWei。
   4. 在窗体上依次放置两个 tButton控件,其 name属性分别为 Btn_PrintToWord、 btn_Quit, Caption属性分别为‘打印’和‘退出’。
  窗体设计格式可参考本文末所附图片。
 
三、代码设计
 
  
  程序段如下所示:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,OleCtnrs,ComObj;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ED_WenHao: TEdit;
ED_BiaoTi: TEdit;
ED_ShouWenDanWei: TEdit;
ED_ZhenWen: TMemo;
ED_FaWenDanWei: TEdit;
Btn_PrintToWord: TButton;
Btn_Quit: TButton;
procedure Btn_PrintToWordClick(Sender: TObject);
procedure Btn_QuitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//开始:数据发送到 word事件
procedure TForm1.Btn_PrintToWordClick(Sender: TObject);
vAR
VarWord: Variant;// 创建 WORD时所用
begin
try
// 1. 建立 OleObject,连接 word97
VarWord:=CreateOleObject('word.basic');
// 2. 建立 Word97的新文件
VarWord.FileNew;
// 3. 设置 Word97的基本状态
VarWord.ViewZoom75; //设置显示比例为 75%
VarWord.ViewPage; //改为页面显示方式
// 4. 将当前数据控件上的信息发送至 Word97
// 4.1 发送文号数据
VarWord.CenterPara; //居中
Varword.font('宋体 '); //设置字体
VarWord.FontSize(14); //设置字号
varword.insert(#13+#13+ ED_WenHao.Text+#13+#13+#13);
// 4.2 发送标题数据
VarWord.font('黑体 ');
VarWord.Fontsize(16);
VarWord.insert( ED_BiaoTi.text+#13);
// 4.3 发送收文单位数据
VarWord.LeftPara; //左对齐
VarWord.Font('宋体 ');
VarWord.fontSize(14);
VarWord.Insert(#13+ ED_ShouWenDanWei.Text+': '+#13);
// 4.5 发送正文数据
VarWord.fontSize(14);
VarWord.Insert( ED_ZhenWen.Text+#13);
// 4.6 发送发文单位数据
VarWord.RightPara; //右对齐
VarWord.fontSize(14);
VarWord.Insert( ED_FaWenDanWei.Text+#13);
// 5 最后设置
VarWord.StartOfdocument; //到文首
VarWord.AppMaxiMize; //设置窗口最大化
VarWord.AppShow; //显示应用程序
except
showmessage('运行 Microsoft Word 失败! ');
end; //end of try
end;
//end:数据发送到 word事件
 
//开始:窗口关闭事件
procedure TForm1.Btn_QuitClick(Sender: TObject);
begin
close;
end;
//End:窗口关闭事件
end.
// 这是主程序的尾部
 
四、附 注
 
一、说明
  1、因只是一个演示示例,故没有与后台数据库连接起来,实际操作可将相应的 tEdit、 tMemo控件用 tDBEdit、 tDBMemo控件所代替,增加 tTable、 tDataSource等控件,连接数据库。
  2、本示便没有考虑如何进行批量打印
  3、程序在 Pwin97、 Delphi 4.0专业版、中文 Word97下通过。
  4、由于 Word有不同的版本,微软在每种外语中转换了一些 OLE自动化接口,如果用其他版本的 Word,本程序运行有可能出错。
  5、可以通过 word97帮助中归结的宏命令来得到相应的驱动命令;亦或可在 Word97下单击[工具]菜单--单击[自定义]--单击[键盘]按钮,可以查看到 Word97中分类别显示的 Word命令。
二、优点与缺点
  1、通过 OLE自动化技术,将公文的排版打印工作交给 Word去完成,对最终用户而言,控制较方便。
  2、在 Word97的若对数据进行了修改,则不能传回调用它的主程序,反映到数据库中。这是它的不便这处。
  3、本例只是在特殊情况下的一种应用,若要打印大量数据标签,制作表格,本人觉得还是用报表灵活一些。
 
小辉
 
顶部