在dehpi中我想输出指定的内容到word的指定位置、如何在word的查找我的指定位置:@日期@ ?而且我想用剪贴板的内容代替他!谢谢各位大哥大姐帮忙!

解决方案 »

  1.   

    看看可不可以用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;
      

  2.   

    首先十分感谢你!
    我前期工作已经做好!只是在输出时无法定位我的模板文档的指定字符的位置:
    如下两个结果都可以:
    1、得到指定字符的坐标。
    2、得到指定字符的Range对象。
    都可以满足我的需求、但是我无法得到!
      

  3.   

    补充:
    1、我得文档模板格式不固定-某个标志符如:(@日期@)的位置不顾定、但是标志符的名称不会变化。
    2、不能使用Range.Find.Execute() 因为他替换的字符的长度有限制、如果稍微长一点就不能输出。
    感谢高手来捧场!
      

  4.   

    在你的WORD模板中加入域然后对域变量传参数,或者直接做标签给标签传参数
      

  5.   

    看看下面的内容,对你也许有帮助。Word宏和Delphi前面我就Delphi中调用Word写了一些,比较注重于具体实现,对于研究的方法则说的比较片面。今天晚上,我静下心来,总结了一下怎样在Delphi中生成操作Word的代码。如果说前面我写的是金子,那么下面这篇文章就是点石成金的手指(太自夸了,呵呵)。毕竟已经有半年多没有研究这些了,只能零碎的写一些心得了。使用CreateOleObject方式调用Word相比Service控件的最大缺点就是不支持代码的自动生成,但是我们充分的利用VBA代码就可以弥补这个功能。Word作为一个功能强大的Com,可以很容易被编程工具调用,成为办公自动化系统中处理文档的强有力的嵌套工具,尤其是充分Word本身的录制宏的功能,更进一步减轻了编程的负担。下面就如何在Delphi里面利用Word的VBA代码进行一些总结。1、 生成VBA代码。Word本身具有很强的可扩展性,尤其是支持用户自定义功能,其实现的主要方式就是通过VBA代码来实现的。在“工具->宏->Visual Basic编辑器”里面就可以看到具体的宏代码,可以直接进行编辑。而且还可以使用录制宏的功能自动生成宏代码。方法是选择“工具->宏->录制新宏”,然后执行自己想通过程序实现的功能,如存盘、打印等功能,此时Word一边执行你要实现功能,一边将你的操作生成了一个宏,在实现功能后,可以选择“工具->宏->VisualBasic编辑器”,查看生成的宏代码。例如:我们要将文档中的“讨论”全部替换成“研讨”。a. 点击“工具->宏->录制新宏”,直接点击确定,默认的宏保存到了Normal.dot系统公用模板里面。b. 点击“编辑->查找”,出现弹出对话框,输入查找和替换的字,点确定。进行替换。c. 结束宏的录制,点击结束按钮。d. 按F11或者“工具->宏->Visual Basic 编辑器”,查看宏代码。缺省查看Normal里面的模块里面的NewMacros模块。以下是生成的宏代码:Sub Macro1()'' Macro1 Macro' 宏在 2002-2-1 由 yzhshi 录制'Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text = "讨论".Replacement.Text = "研讨".Forward = True.Wrap = wdFindContinue.Format = False.MatchCase = False.MatchWholeWord = False.MatchByte = True.MatchWildcards = False.MatchSoundsLike = False.MatchAllWordForms = FalseEnd WithSelection.Find.Execute Replace:=wdReplaceAllEnd Sub2、 精简宏代码。通常,生成的宏代码有很多语句对你要实现的功能来说都是多余的。我们要做的就是如何找到我们需要的代码。此时我们查看具体的代码,剔除明显没有用途的代码,然后光标停留在宏上面,按F5执行,看是否实现功能,逐步精简,得到最小代码。此步骤可参考Word的VBA帮助来判断代码是否有用。如上例,精简下来,剩下以下代码。Sub Macro1()Selection.Find.ClearFormattingSelection.Find.Replacement.ClearFormattingWith Selection.Find.Text = "讨论".Replacement.Text = "研讨"End WithSelection.Find.Execute Replace:=wdReplaceAllEnd Sub3、 转换成Delphi代码。这一步其实很简单,对于VBA代码,只需要在前面添加Word的句柄或者文档的句柄或者文档的句柄.Application就可以直接操作了。例:逐句翻译:(Word_Handle是Word的句柄)(VB) Selection.Find.ClearFormatting(Delphi) Word_Handle.Selection.Find.ClearFormatting;(VB) Selection.Find.Replacement.ClearFormatting(Delphi) Word_Handle.Selection.Find.Replacement.ClearFormatting;以上两句简单添加上Word的句柄就可以了。(VB) With Selection.FindText = "讨论"Replacement.Text = "研讨"End With(Delphi) Word_Handle.Selection.Find.Text := '讨论';Word_Handle.Selection.Find.Replacement.Text := '研讨';以上几句因为Delphi不支持Variant的With结构,所以分开写。同时转换成Delphi语法。(VB) Selection.Find.Execute Replace:=wdReplaceAll(Delphi) Word_Handle.Selection.Find.Execute(Replace:=2);上面一句存在一个小技巧,如何找到常量wdReplaceAll的数值为2?这里有几个办法,一:直接use Word2000或者word97单元,那么直接使用常量wdReplaceAll就可以了;二:到Word2000.pas或者Word97.pas里面查找wdReplaceAll的数值;三:直接使用VBA代码见wdReplaceAll的数值显示出来。办法是写一个小过程,然后执行,如下:Sub ShowValue()MsgBox wdReplaceAllEnd Sub最后补充一下,很多关于Word的东西可以从Word的VBA帮助里面获得。具体文件在
      

  6.   

    //可以替换所有的Range的内容
    procedure ToReplaceTextEx1(vDocment :OleVariant;FindText ,ReplaceText :AnsiString);
    var
       iCount,i:Integer ;
       Range:OleVariant ;
    begin
       try
        iCount:=vDocment.Paragraphs.Count ;
        for  i:=1  to iCount do
        begin
            Range:=vDocment.Paragraphs.Item(i).Range ;
            if  Pos(FindText,Range.Text)>0 then               //Range.Text='<@证据内容@>'
            begin
               Range.Text:=ReplaceText ;
            end;
        end
       finally
       end;
    end;