灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3653回复:0

用Word做Delphi报表输出工具

楼主#
更多 发布于:2012-09-08 13:05

worddelphi报表输出工具  
整理编辑:China ASP

  笔者在实际应用中发现,报表的内容一般很少变动,但其字体格式及版式是经常变动的,而且有时用户为了某种需要,不想修改数据库的真实内容而又要改变报表内容。如果用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:msofficewinword;
          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中即可实现您所要求的更复杂的功能。

喜欢0 评分0
游客

返回顶部