Конференция "Начинающим" » Замена текста в Word [D7]
 
  • Елена (28.06.16 17:14) [0]
    Здравствуйте.
    Использую такой код для замены в Вордовском файле нужных мне строк.


    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 символов, чтоб все работало?
    Спасибо.
  • RWolf © (28.06.16 17:18) [1]
    Можно вставлять строку в несколько приёмов.
  • Елена (28.06.16 17:33) [2]

    > Можно вставлять строку в несколько приёмов.

    Это проблемно, так как я не знаю заранее какая будет длина строки. А метка для вставки в документ только одна $str$.  если я в файле напишу вторую метку (например $str2$) а строка будет меньше 255 символов, то в нее ничего не заменится, и она так и останется в файле.
  • poi (28.06.16 17:44) [3]
    находишь нужное в ворде и заменяешь на $part1$$part2$$part3$

    затем заменяешь все три $part...$
    на куски длины меньшей 255 из мема
  • Елена (28.06.16 17:48) [4]
    Спасибо, это интересно. Тогда еще вопросик, а как длинную строку (например 600 символов) разделить на части?
  • Елена (28.06.16 17:50) [5]
    я имею в виду в компоненте memo есть текст, в первой строке 300 символов, во второй 200, в третей 100 символов.
  • poi (28.06.16 17:54) [6]
    тут высшая математика нужна, так сходу на пальцах не объяснить.
  • poi (28.06.16 18:07) [7]
    найти заменяемое в ворде;

    пока есть текст в меме
    взять первые 200 букв из мемо;
    если итерация первая, то
     заменить заменяемое на 200 букв + $tail$
    иначе
     заменить $tail$ на 200 букв + $tail$
    удалить первые 200 букв из мема;
    вернуться в начало цикла

    по выходу из цикла заменить $tail$ на пустоту;

    либо не приклеивать $tail$ к замене, если замена последняя
  • Елена (28.06.16 18:20) [8]
    спасибо большое за алгоритм. Все понятно. Только не знаю пока как взять первые 200 символов из memo, а потом их из memo удалить?
  • Елена (28.06.16 19:11) [9]
    Ура, нашла. Вот вроде получилось.
    Кусочек кода который это делает.

    var
     Text, Word: String;
    begin
     Text := Memo1.Lines.Text;

     Word:=Copy(Text,1,200);

     // тут отправим в Ворд

     Delete(Text,1,200);

     Memo1.Lines.Text := Text;

  • Внук © (29.06.16 13:09) [10]

    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
       // Максимальная допустимая длина строки строки - 255, с учетом длины тега
       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;

 
Конференция "Начинающим" » Замена текста в Word [D7]
Есть новые Нет новых   [134428   +40][b:0][p:0.003]