将WORD中制定字符替换成数据库中数据时报错(50分)

  • 主题发起人 主题发起人 Angel.wcx
  • 开始时间 开始时间
A

Angel.wcx

Unregistered / Unconfirmed
GUEST, unregistred user!
我将一个表中的数据(均为STRING,MEMO型)导入WORD文档,可是有的记录报错:“字符串参量过长”,
请问这是怎么回事?是不是某些字段值太多了?那么又如何知道这个限制?
 
写几行出错程序!
 
to lq123:
while not Query1.eof do
begin
i:=i+1;
FindText1 := '<Name'+inttostr(i)+'>';
FindText2 := '<pm'+inttostr(i)+'>';
FindText3 := '<fcon'+inttostr(i)+'>';
FindText4 := '<pcon'+inttostr(i)+'>';
FindText5 := '<rem'+inttostr(i)+'>';

ReplaceWith1 := Query1.fieldbyname('project_name').asstring;
ReplaceWith2 := Query1.fieldbyname('name').asstring;
ReplaceWith3 := Query1.fieldbyname('fcontent').asstring;
ReplaceWith5 := Query1.fieldbyname('remark').asstring;

Query2.Close ;
Query2.ParamByName ('MProject_id2').asstring:=Query1.fieldbyname('project_id2').asstring;
Query2.ParamByName ('M_date').asstring:=FormatDateTime('yyyy"/"mm"/"dd',DateTimePicker2.date);
Query2.Open ;
ReplaceWith4 := Query2.fieldbyname('pcontent').asstring;

Qstaff.Close ;
Qstaff.ParamByName ('MProject_id2').asstring:=Query1.fieldbyname('project_id2').asstring;
Qstaff.ParamByName ('M_serial').asstring:=Query1.fieldbyname('serial').asstring;
Qstaff.Open ;
j:=0;
if Qstaff.RecordCount <>0 then
while not Qstaff.Eof do
begin
j:=j+1;
find1:='<n'+inttostr(i)+inttostr(j)+'>';
find2:='<t'+inttostr(i)+inttostr(j)+'>';
rep1:=Qstaff.fieldbyname('name').asstring;
rep2:=Qstaff.fieldbyname('opinion').asstring;

WordDocument1.Range.Find.Execute( Find1, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, Rep1, Replace );

WordDocument1.Range.Find.Execute( Find2, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, Rep2, Replace );

Qstaff.Next ;
end;
WordDocument1.Range.Find.Execute( FindText1, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith1, Replace );

WordDocument1.Range.Find.Execute( FindText2, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith2, Replace );

WordDocument1.Range.Find.Execute( FindText3, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith3, Replace );

WordDocument1.Range.Find.Execute( FindText4, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith4, Replace );

WordDocument1.Range.Find.Execute( FindText5, MatchCase, MatchWholeWord,
MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward,
Wrap, Format, ReplaceWith5, Replace );

Query1.Next ;
end;

Fsumdoc_imp.Close ;
label2.Caption :='';
end;

有的记录替换没问题,有的却报错,是不是与输入的记录格式或长度有关?
 
注意:
替换的文本长度不能超过255,切记!!!
 
那么也就是说我没有办法将memo类型(超过255)的字段导入WORD文档?或许还有其他的方法?
请指教!
 
有一个笨方法:
首先将需要填写的内容复制到到剪贴板上,
然后将WordDocument1.Range.Find.Execute中 ReplaceWith 指定为“ ^c”。
 
用书签试试
 
to Crab:
能不能说的详细一点?谢谢!
 
to lq123:
用剪贴板也不行,主要是replacewith只能接收部分值。
 
我目前也遇到这样的问题,替换的只允许在255个字符以内,苦恼。
我想的也是粘贴的办法,
findtext := '<#text>';
replacewith := '';
replace := true;
wrap:=wdFindStop;
worddocument.range.find.execute( 。。。。。);
DBMemo1.SelectAll;
DBMemo1.CopyToClipboard ;
//WordDocument.Range.Paste;
//WordDocument.Range.Bookmarks;
WordDocument.Sentences.Last.Paste; <----error
我的意思就是先找到<#text>部分,替换成空格以后,在当前的光标位置贴入粘贴板上
的内容。可是我不知道怎么让光标停在当前位置,另外最后一句该怎么写?现在的效果是
当前文档的最后部分被dbmemo1的替换,而并不是我想的《#text》该句的最后被替换,
不知道谁能解决。可另外给分,放心好了。

 
我查看了有关标签的方法,似乎可行,可我不知道具体怎么做,如有例子就好了。
 
以下为例:
1、在WORD中插入书签名为“MM”;
2、在程序中定义 bookmark1:OLEVariant;
在FORM上添加WORDAPPLICATION,WORDDOCUMENT
指定打开WORD文档;假设一个MEMO字段名为“MM1”,
var tmpstring:String;
...
tmpstring:=table1.fieldbyname('MM1').AsString;
BookMark1:='addr';
try
WordApp.ActiveDocument.Bookmarks.Item(BookMark1).Range.InsertAfter(tmpstring);
except
end;
 
书签的使用方法,vbawrd8.hlp 里有,别的贴子里也有。
这种方法的缺点是,必须事先定义好书签,对于临时生成的文档有点麻烦,可能需要先找到
相应的位置,然后生成一个书签,再把书签替换成所需要文本。
 
word可以替换
剪贴板的东西
用^C
 
请继续或结束
 
请继续或结束

 
请结束或继续
 
我在大文档合并时也遇到这个问题。
 
对于255个字符的问题,完全可以用书签的方法达到,
对于达文档合并的问题用InsertFile的方法可以达到,这两个问题我刚好不久前做过。
 
当InsertFile很多后,出现‘生成的文档太复杂,请立刻保存全部文档’
调用保存命令后还是一样出现这个对话框,但是确定后能进行下去。
 
后退
顶部