大家好,我想用Delphi 调用Word 打印合同,请问可以如何做?非常感谢各位DFW朋友!!(100分)

  • 主题发起人 主题发起人 fbb
  • 开始时间 开始时间
F

fbb

Unregistered / Unconfirmed
GUEST, unregistred user!
为了使应用程序与WORD合为一个程序,选择用ToleContainer,但是这种方式如何实现打印和
关闭WORD 中的原有工具条,请各位帮忙讨论一下 :)[:)]
代码:
[blue][/blue]
 
用Word做Delphi报表输出工具
  笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。如果用ReportSmith可以解决前者问题,但对于后者则无能为力了,且其界面是英文的,不合用户习惯。如果用3.0中的TQReport的报表部件,则两者都不能实时解决,必须修改原代码后重新编译才能使用。而使用Word及Excel则完全可以克服以上不足。具体实现如下(以Word实现为例):

  首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件Example.dot,然后按如下步骤进行:

  1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov部件,取名为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService设为‘(WinWord)’;将ServiceApplication设为‘WinWord’。

  2)编写一个自定义过程,以激活Word,如下:

  procedure Tform1.WordActive(Cmds: TStrings);

  var

   WordPath: String;

  begin

   if(not DdeExample.OpenLink) then {判断是否巳动态链接}

   begin

  if(FindWindow('OpusApp', nil)=0) then

  begin

  WordPath := 'C:/msoffice/winword';

   if(WordPath='') then

  ShowMessage('中文Word未安装或未设置路径,请安装设置Word中文 版。')

   else begin

  DdeExample.ServiceApplication := WordPath+'/Winword.exe';

  if(DdeExample.OpenLink) then {如果巳动态链接执行宏命令}   

DdeExample.ExecuteMacroLines(Cmds,False)

  else

ShowMessage('无法启动Word中文版!');

  DdeExample.ServiceApplication := 'WinWord.exe';

  end;

   end

   else begin{如果巳动态链接执行宏命令}

   DdeExample.ExecuteMacroLines(Cmds,False);

   end;

   end

   else

   DdeExample.ExecuteMacroLines(Cmds,false);

  end;



  在private声明区里加入如下:

  procedure ActiveWord(Cmds: TStrings);



  3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码:

  procedure TForm1.Button1Click(Sender: TObject);

  var

  Cmds:TStringList;{创建Cmds}

  TempItem1,TempItem2:String;

  begin

  cmds:=TStringList.Create;

  cmds.Clear;

  TempItem1:='数据项一';

  TempItem2:='数据项二';

  with Cmds do

  begin

  Clear;

  Add('[FileNew.Template ="Example.Dot″]');{打开模板文件Example.Dot}

  Add('[AppMaximize]');{文档最大化}

  Add('[SetFormResult"Item1″,″'+TempItem1+'″]');{将数据TempItem1传给表单域Item1}

  Add('[SetFormResult"Item2″,″'+TempItem2+'″]);{将数据TempItem2传给表单域Item2}

  end;

  WordActive(DdeExample,Cmds);{调用自定义过程}

  Cmds.Free;{释放Cmds}

  end;

  运行这个程序,单击Button1,大家可以发现Word被启动了,屏幕上出现了:数据项一;数据项二两个数据项。最后,大家可以任意修改本报表的格式及数据,因为这时这个报表与具体的应用程序巳没有关系了。

  本例中用的是中文Word6或中文Word7。由于Word97的宏命令巳变为Visual Basic语句,如大家想用Word97实现,请将其宏命令改变为相应的代码。

  这是个简单的示例,大家可以利用Word的宏录制功能,录取更多的宏(如自动生成表格、填充文字、变动字体等宏命令),并与数据库的各种表联系起来,依次加入Cmds中即可实现您所要求的更复杂的功能。








 
nihao
to chenzheng: 用你的程序要另外打开WORD窗口,不能在应用程序中打开,我把代码写入不知道如何运行,还有运行DLL??,请写的详细些吧。
我的要求是用TOleContainer实现把WORD嵌入到应用程序中,
实现:1、打印预览,2、屏蔽工具条。
问题似乎是OleContainer.OleObject 对象的使用,还有如何获得WORD 的 Application。


-----------
2. 我现在要实现的是用TOleContainer 进行打印,请DFW 们帮助。非常感谢!
[8D]-:)
 

Similar threads

D
回复
0
查看
932
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部