将数据导出到已经做好的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
原来也看过其他人的帖子,有用表单域的,但是我试的时候总是提示“集合所要求的成员不存在。”
以下是我的替换代码和用表单域的代码替换方式:
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
解决方案 »
- 贴一个indy9的ftpserver程序,提点问题
- 关于编写网页游戏外挂的一些技术问题,高分咨询!
- API sendMessage
- 请问各位高手一个关于QuickReport的问题
- 如果现在开发多层的应用系统,在使用Delphi作为开发工具(不限制版本),有哪几种技术作为选择
- 帮帮忙,Toolbar的图标没法改变大小了
- 谁有delphi 6 personal edition 的注册号,请给小弟一个,感激不尽!!!!!!
- 刚申请的号每分啊。。有人免费帮我不啊?
- 高分讨教高手:FastReport难题
- :C/S+socket在客户端TCP/IP中设置DNS后无法把本机作为服务器怎办?不设又无法使用winroute上网。
- 小弟初学DELPHI与数据库关联,ADO+ACCESS,提示说"from子句语法错误"
- 很奇怪的问题?大家来看看!
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.
不行啊,当字符长度超过500多的时候,系统提示“字符串参量过长”,郁闷……,各位都给点招啊,我要郁闷死了
//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;暂时先不结贴,看看各位还有什么高招?我这个方法属于偷梁换柱了,嘻嘻
微软的开发工具依然大行其道,delphi阵营日益萎缩,是不是和这个也有关系?
如果delphi帮助里有这些,我也不用花费200分,发2个帖子,更重要的是节省时间啊。