-
Здравствуйте. Использую такой код для замены в Вордовском файле нужных мне строк.
procedure TForm1.Button3Click(Sender: TObject);
var Word: variant;
FilePath: string;
function FindAndReplace(FindText: string):boolean;
const wdReplaceAll = 2;
begin
Word.Selection.Find.MatchSoundsLike := False;
Word.Selection.Find.MatchAllWordForms := False;
Word.Selection.Find.MatchWholeWord := False;
Word.Selection.Find.Format := False;
Word.Selection.Find.Forward := True;
Word.Selection.Find.ClearFormatting;
Word.Selection.Find.Text:=FindText;
Word.Selection.Find.Replacement.Text:=Memo1.Text;
FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll); end;
begin
Word:=CreateOleObject('Word.Application');
Word.Visible:=Visible;
FilePath := 'D:\документ.doc';
Word.Documents.Open(FilePath);
memo1.text := 'Этим текстом мы заменим нужную строку в Ворде';
FindAndReplace('$str$');
end;
Все работает хорошо, но есть проблема. Если в компоненте memo1 текст длиннее 255 символов, то пишет ошибку «Слишком длинный строковый параметр». Можно ли как то сделать заменяемую строку длиннее 255 символов, чтоб все работало? Спасибо.
-
Можно вставлять строку в несколько приёмов.
-
> Можно вставлять строку в несколько приёмов.
Это проблемно, так как я не знаю заранее какая будет длина строки. А метка для вставки в документ только одна $str$. если я в файле напишу вторую метку (например $str2$) а строка будет меньше 255 символов, то в нее ничего не заменится, и она так и останется в файле.
-
находишь нужное в ворде и заменяешь на $part1$$part2$$part3$
затем заменяешь все три $part...$ на куски длины меньшей 255 из мема
-
Спасибо, это интересно. Тогда еще вопросик, а как длинную строку (например 600 символов) разделить на части?
-
я имею в виду в компоненте memo есть текст, в первой строке 300 символов, во второй 200, в третей 100 символов.
-
тут высшая математика нужна, так сходу на пальцах не объяснить.
-
найти заменяемое в ворде;
пока есть текст в меме взять первые 200 букв из мемо; если итерация первая, то заменить заменяемое на 200 букв + $tail$ иначе заменить $tail$ на 200 букв + $tail$ удалить первые 200 букв из мема; вернуться в начало цикла
по выходу из цикла заменить $tail$ на пустоту;
либо не приклеивать $tail$ к замене, если замена последняя
-
спасибо большое за алгоритм. Все понятно. Только не знаю пока как взять первые 200 символов из memo, а потом их из memo удалить?
-
Ура, нашла. Вот вроде получилось. Кусочек кода который это делает. var
Text, Word: String;
begin
Text := Memo1.Lines.Text;
Word:=Copy(Text,1,200);
Delete(Text,1,200);
Memo1.Lines.Text := Text;
-
procedure ReplaceString(const AFind: Variant; const ATag, AValue: string);
const
wdReplaceAll = 2;
begin
AFind.Text := ATag;
AFind.Replacement.Text := AValue;
AFind.Execute(Replace := wdReplaceAll);
end;
procedure ReplaceLongString(const AFind: Variant; const ATag, AValue: string);
var
S: string;
NextPart: string;
MaxLength: integer;
begin
MaxLength := 255 - Length(ATag);
S := AValue;
repeat
NextPart := Copy(S, 1, MaxLength);
if Length(S) > MaxLength then
NextPart := NextPart + ATag;
ReplaceString(AFind, ATag, NextPart);
S := Copy(S, MaxLength + 1, Length(S));
until S = '';
end;
|