将数据导出到已经做好的WORD模板中,采用字符替换的方式,但是当要替换的字符超过504个字符(252个汉字)的时候,出错。我的程序里要导出的数据有不少是MEMO型的,内容超长,怎么办,大家给个建议。
原来也看过其他人的帖子,有用表单域的,但是我试的时候总是提示“集合所要求的成员不存在。”
以下是我的替换代码和用表单域的代码替换方式:
NewDocument := Word_ole.Documents.add(ExtractFilePath(Application.ExeName) + 'test.dot');
wApp:=newdocument.Application;
wApp.selection.find.text:='<%a1%>';
wApp.selection.find.replacement.text:='被替换的字符';
wApp.selection.find.execute(replace:=wdReplaceAll);表单域方式:
Fields := newdocument.FormFields;
Fields.Item('TTT').Result := String('TTT');只要解决,替换方式的字符长度限制或者表单域方式的“集合所要求的成员不存在”两个问题的其中之一都可以,拜托各位,帮忙解决一下。我已经火烧眉毛了……
我用的是delphi6+office2000

解决方案 »

  1.   

    这是我以前写的替换WORD文档内容,你看看
    unit un_main;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Word2000;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      Pub_SavePath:OleVariant;
      WordDocument1: TWordDocument;
      WordApplication1: TWordApplication;
      procedure LaunchWord(FileName,WordCap:string);
      procedure RepData(MyDoc: TWordDocument; FindStr, RepStr: string);
      procedure SaveWord(WordName:string);
      procedure CloseWord;
      procedure FreeWordCtl;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      //打开Word模板
      LaunchWord('A.dot','Test');
      //替换指定参数
      RepData(WordDocument1,'Sdfadfa','123');
      //保存Word文件
      SaveWord('WordTest.doc');
      //释放控件
      FreeWordCtl;
    end;procedure LaunchWord(FileName,WordCap:string); //打开Word模板
    //TemplateName:模板地址及名称、FindStr:被查找的字符串、RepStr:要替换的字符串。
    var
      OpenDialog1: TOpenDialog;
      SaveDialog1: TSaveDialog;
      WordApplication1: TWordApplication;
      Template, NewTemplate, ItemIndex,OldTemplate,OthTemplate: OleVariant;
      i:integer;
    begin
      try
        OpenDialog1:=TOpenDialog.Create(application);
        WordDocument1:=TWordDocument.Create(application);
        opendialog1.FileName:=FileName;
        if opendialog1.Execute then
          Pub_SavePath:=opendialog1.FileName
        else
          exit;
        if (fileexists(Pub_SavePath)=false) then
        begin
          i:=filecreate(Pub_SavePath);
          fileclose(i);
        end;
        try
          ItemIndex := 1;
          try
            if not assigned(wordapplication1) then
              wordapplication1:=Twordapplication.Create(application);
            Wordapplication1.Connect;
          except
            begin
              MessageDlg('无法连接,也许没有安装Word', mtError, [mbOk], 0);
              Exit;
            end;
          end;
          Wordapplication1.Visible := true;
          WordApplication1.Caption := WordCap;
      //建立一个新文档
          Template := Pub_SavePath;
          NewTemplate := True;
          OldTemplate := True;
          OthTemplate :=EmptyParam;
          WordApplication1.Documents.Add(Template, NewTemplate,OthTemplate,OldTemplate);
      //建立WordDocument连接
          WordDocument1.ConnectTo(WordApplication1.Documents.Item(ItemIndex));
      //因为Word进行拼写检查需要很多时间,所以首先关闭检查
          WordApplication1.Options.CheckSpellingAsYouType := False;
          WordApplication1.Options.CheckGrammarAsYouType := False;
        except
          MessageDlg('!', mtError, [mbOk], 0);
          WordApplication1.Disconnect;
          //word1.Enabled := true;
        end;
      finally
        OpenDialog1.Free;
        //OpenDialog1:=nil;
        //Wordapplication1.Free;
        //WordDocument1.Free;
      end;
    end;procedure RepData(MyDoc: TWordDocument; FindStr, RepStr: string); //利用数据库替换Word字符串函数
    //FindStr:被查找的字符串。RepStr:要替换的字符串。
    var
      MatchCase, MatchWholeWord, find1, rep1, Format,Tempole,
      MatchWildcards, MatchSoundsLike, MatchAllWordForms, Foreward,
      Wrap, Replace: OleVariant;
    {以上函数为Word实现替换的系统变量,详情请参阅Word的在线帮助。}
    begin
      TempOle:=EmptyParam;
      Find1 := FindStr; //替换的目的字符串。
      Rep1 := RepStr; //替换的源字符串。
      MatchCase := false;
      MatchWholeWord := true;
      MatchWildcards := false;
      MatchSoundsLike := false;
      MatchAllWordForms := false;
      Format := true;
      Foreward := true;
      replace := wdReplaceall;
      Mydoc.Range.Find.Execute(find1, MatchCase, MatchWholeWord,
      MatchWildcards, MatchSoundsLike, MatchAllWordForms, Foreward,
      Wrap, Format, Rep1, Replace,TempOle,TempOle,TempOle,TempOle);
    end;procedure SaveWord(WordName:string);
    var
      SaveChanges,OriginalFormat, RouteDocument,SaveName:OleVariant;
    begin
      SaveChanges := WdDoNotSaveChanges;
      OriginalFormat := UnAssigned;
      RouteDocument := UnAssigned;
      SaveName:=WordName;
      try
        WordDocument1.SaveAs(SaveName);
      except
        MessageDlg('已经被打开或保存失败,请退出检查后重试...', mtError, [mbOk], 0);
      end;
    end;procedure CloseWord;
    var 
      SaveChanges, OriginalFormat, RouteDocument: OleVariant;
    begin 
      SaveChanges := WdDoNotSaveChanges;
      OriginalFormat := UnAssigned;
      RouteDocument := UnAssigned; 
      try
        WordApplication1.Quit(SaveChanges, OriginalFormat, RouteDocument);
        //WordApplication1.Quit;
        WordApplication1.Disconnect;
      except 
        on E: Exception do
        begin 
          //Showmessage(E.Message);
          WordApplication1.Disconnect;
        end;
      end;
    end; procedure FreeWordCtl;
    begin
      WordDocument1.Free;
      Wordapplication1.Free;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      application.Terminate;
    end;end.
      

  2.   

    首先谢谢bee2518(迷茫ing)
    不行啊,当字符长度超过500多的时候,系统提示“字符串参量过长”,郁闷……,各位都给点招啊,我要郁闷死了
      

  3.   

    或者,哪位朋友知道如何在WORD中控制光标的位置,我在当前位置插入超长字符也可以
      

  4.   

    用widestring变量存长字符再替换可否?
      

  5.   

    要不插入的时候,先判断下LENGTH,如果大,则分割,做循环插入
      

  6.   

    搞出来了,共享一下
    //strfind是要被替换的字符;strRplc是替换后的字符,突破了500个字符的限制。
    //其实原理很简单,先查找字符如果找到用‘ ’替换,然后在当前位置用typetext方法输入超长字符串
    //在word中先录了一段宏,然后移植到delphi中,以后涉及office的问题建议大家都可以用这种方法试试。
    Function ReplaceMemo(strfind, strRplc: String; vDocApp: Variant): Boolean;
    Var
      i: integer;
    Begin
      Try
        Result := false;
        vDocApp.Options.ReplaceSelection := True;
        vDocApp.Selection.Find.ClearFormatting;
        vDocApp.Selection.Find.Text := strfind;
        vDocApp.Selection.Find.Replacement.Text := '';
        vDocApp.Selection.Find.Forward := True;
        vDocApp.Selection.Find.Wrap := wdFindContinue;
        vDocApp.Selection.Find.Format := false;
        vDocApp.Selection.Find.MatchCase := false;
        vDocApp.Selection.Find.MatchWholeWord := false;
        vDocApp.Selection.Find.MatchByte := True;
        vDocApp.Selection.Find.MatchWildcards := false;
        vDocApp.Selection.Find.MatchSoundsLike := false;
        vDocApp.Selection.Find.MatchAllWordForms := false;
        If vDocApp.Selection.Find.Execute Then
          If strRplc <> '' Then
            vDocApp.Selection.TypeText(strRplc)
          Else
            vDocApp.Selection.TypeText(' ');
        vDocApp.Selection.homekey(Unit := wdStory);    
        Result := True;
      Except
        Result := false;
      End;
    End;暂时先不结贴,看看各位还有什么高招?我这个方法属于偷梁换柱了,嘻嘻
      

  7.   

    其实这些东西,delphi的pas文件里都有,但是为什么不给个帮助?相反office的vba帮助非常的详细,难道这就是实力的差距?
    微软的开发工具依然大行其道,delphi阵营日益萎缩,是不是和这个也有关系?
    如果delphi帮助里有这些,我也不用花费200分,发2个帖子,更重要的是节省时间啊。