Delphi word замена всех

Доброго времени суток!

Сделал простенький компонент для замены текста в документах Word (docx) и OpenDocument (odt). Особенностью данного компонента является отсутствие необходимости какого-либо дополнительного ПО типа MS Office или OpenOffice и использует только встроенные библиотеки. В связи с чем он может работать на различных платформах (но ещё не проверял :) ).

DocumentProcessing.zip

Как использовать:

uses
  DocumentProcessing;

...

procedure TForm2.Button1Click(Sender: TObject);
var
  Document: TDocumentProcessor;
begin
  Document:= TDocumentProcessor.Create(Self);

  Document.FilePath:= 'D:test.docx';
  Document.Open(TDocumentKind.dkDocx);
  Document.ReplaceText('Familiya', 'Cat');
  Document.Save;

  Document.Open('D:test.odt', TDocumentKind.dkOdt);
  Document.ReplaceText('Familiya', 'Cat', [rfReplaceAll]);
  Document.Save;
end;

Немного о принципе работы:

Спойлер

Думаю стоит немного объяснить принцип работы компонента.

Дело в том, что в документах одно слово может храниться частями. Часто это бывает, если использовать использовать стили на части слова, например:

Firemonkey

В документе данное слово будет разделено на «Fire» и «monkey». Данному компоненту это не помеха, но стоит знать, что при замене вставленное слово будет иметь стиль левой части, т.е. если мы заменим «Firemonkey» на «Delphi», то отображаться он будет следующим образом:

Delphi

Проблемы:

Спойлер

1. Не знаю как реализовать чувствительность к регистру (связано с использованием функции IndexOf)


Изменено 28 августа, 2019 пользователем Шамсуддин

Улучшена производительность

>
Замена текста в Word!

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему

  


Сообщ.
#1

,
05.09.06, 08:00

    Full Member

    ***

    Рейтинг (т): -1

    У меня есть едит. И ворд. В ворде есть текст: @edit1@. Как мне
    этот текст (в ворде) заменить на тот, что у меня в едите?

    Guru

    volvo877



    Сообщ.
    #2

    ,
    05.09.06, 08:03


      BIG-VL



      Сообщ.
      #3

      ,
      05.09.06, 08:10

        Full Member

        ***

        Рейтинг (т): -1

        Читал!!! Не могу понять!!!


        dron-s



        Сообщ.
        #4

        ,
        05.09.06, 08:13

          BIG-VL
          вот такой вот мудуль

          ExpandedWrap disabled

            unit MyWord;

            interface

            //*******************создаём объект ворд****************************************

              function CreateWord:boolean;

            //*******************делаем видимым*********************************************

              function VisibleWord(Visible:boolean):boolean;

            //*******************Поиск и замена*********************************************

              function FindAndReplace(FindText, ReplacementText:string):boolean;

            //*******************Проверяем, установлен ли ворд******************************

              function IsWordInstalled: Boolean;

            //*******************Открытие документа*****************************************

              function OpenDocFile(FileWord, Pass:string):boolean;

            implementation

            //*******************необходимые модули*****************************************

            uses ComObj,Registry,Windows;

            //*******************переменная для работы с объектом***************************

            var

              Word:variant;

            //*******************создаём объект ворд****************************************

            function CreateWord:boolean;

            begin

              CreateWord := true;

               try

                Word := CreateOleObject(‘Word.Application’);

               except

                CreateWord := False;

               end;

            end;

            //*******************делаем видимым*********************************************

            function VisibleWord(Visible:boolean):boolean;

            begin

              VisibleWord := True;

               try

                Word.Visible := Visible;

               except

                VisibleWord := False;

               end;

            end;

            //*******************Поиск и замена*********************************************

            function FindAndReplace(FindText, ReplacementText:string):boolean;

            const

               wdReplaceAll=2;

            begin

              Word.Selection.Find.Text := FindText;

              Word.Selection.Find.Replecement.Text := ReplacementText;

              FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll);

            end;

            //*******************Проверяем, установлен ли ворд******************************

            function IsWordInstalled: Boolean;

            var

              Reg: TRegistry;

              s: string;

            begin

              Reg := TRegistry.Create;

               try

                 Reg.RootKey := HKEY_CLASSES_ROOT;

                 Result := Reg.KeyExists(‘Word.Application’);

               finally

                 Reg.Free;

               end;

            end;

            //*******************Открытие документа*****************************************

            function OpenDocFile(FileWord, Pass:string):boolean;

            const

               wdOpenFormatTemplate=2;

            begin

              Word.Documents.Open(FileName:=FileWord,Format:=wdOpenFormatTemplate,

                                          PasswordDocument:= Pass);

            end;

            //*******************Конец модуля***********************************************

            end.

          полностью рабочий, писал для собственных нужд…
          если что н понятно, пиши

          Guru

          volvo877



          Сообщ.
          #5

          ,
          05.09.06, 08:14

            Цитата BIG-VL @ 05.09.06, 08:10

            Не могу понять!!!

            Что именно не понятно?


            dron-s



            Сообщ.
            #6

            ,
            05.09.06, 08:16

              хе, так это же мой модуль :)
              и что тебе тогда правда непонятно!!!!!!!!!????????? :blink:


              BIG-VL



              Сообщ.
              #7

              ,
              05.09.06, 08:32

                Full Member

                ***

                Рейтинг (т): -1

                Блин не могу понять, а что именно не могу сказать потому чо всё! Этот модклю подключаю а дальше?


                dron-s



                Сообщ.
                #8

                ,
                05.09.06, 08:42

                  подключаешь модуль, а дальше используешь его функции

                  ExpandedWrap disabled

                    CreateWord;

                    OpenDocFile(‘путь к файлу’,»);

                    FindAndReplace(‘что нужно заменить’,’на что нужно заменить’);

                    VisibleWord;

                  Guru

                  volvo877



                  Сообщ.
                  #9

                  ,
                  05.09.06, 08:45

                    Цитата BIG-VL @ 05.09.06, 08:32

                    что именно не могу сказать потому чо всё!

                    :blink:
                    Если пользуешься процедурой tIce — то:

                    ExpandedWrap disabled

                      procedure TForm1.Button1Click(Sender: TObject);

                      begin

                        Word_StringReplace(‘C:Test.doc’,’@edit1@’,Edit1.Text, [wrfReplaceAll]); // Замени test.doc на имя своего файла

                      end;


                    BIG-VL



                    Сообщ.
                    #10

                    ,
                    05.09.06, 08:47

                      Full Member

                      ***

                      Рейтинг (т): -1

                      Цитата dron-s @ 05.09.06, 08:42

                      подключаешь модуль, а дальше используешь его функции

                      ExpandedWrap disabled

                        CreateWord;

                        OpenDocFile(‘путь к файлу’,»);

                        FindAndReplace(‘что нужно заменить’,’на что нужно заменить’);

                        VisibleWord;

                      Во это уже лучше!!!

                      Добавлено 05.09.06, 08:47

                      Цитата volvo877 @ 05.09.06, 08:45

                      Если пользуешься процедурой tIce — то:

                      Это я не понял!!! :wall:


                      dron-s



                      Сообщ.
                      #11

                      ,
                      05.09.06, 08:48

                        Цитата volvo877 @ 05.09.06, 08:45

                        что именно не могу сказать потому чо всё!

                        такое чувство, что BIG-VL не имеет не малейшего представления что к чему :wacko:

                        Guru

                        volvo877



                        Сообщ.
                        #12

                        ,
                        05.09.06, 08:49

                          BIG-VL >:( Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ???


                          dron-s



                          Сообщ.
                          #13

                          ,
                          05.09.06, 08:49

                            Цитата BIG-VL @ 05.09.06, 08:47

                            Во это уже лучше!!!

                            и что, это тоже не работает?


                            BIG-VL



                            Сообщ.
                            #14

                            ,
                            05.09.06, 08:51

                              Full Member

                              ***

                              Рейтинг (т): -1

                              Цитата volvo877 @ 05.09.06, 08:49

                              BIG-VL Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ???

                              Я смотрел…

                              Цитата dron-s @ 05.09.06, 08:48

                              такое чувство, что BIG-VL не имеет не малейшего представления что к чему

                              Если честно то да не пойму что к чему!!! :wall:

                              Добавлено 05.09.06, 08:53

                              Цитата dron-s @ 05.09.06, 08:49

                              и что, это тоже не работает?

                              Не могу сказать, не проверил ещё!!! Ща проверю и скажу!!! :unsure:

                              Добавлено 05.09.06, 08:55
                              Когда подключил модуль то сказал он ошибка…

                              [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’

                              в строке

                              ExpandedWrap disabled

                                FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll);


                              dron-s



                              Сообщ.
                              #15

                              ,
                              05.09.06, 09:09

                                Цитата BIG-VL @ 05.09.06, 08:51

                                Когда подключил модуль то сказал он ошибка…

                                [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’

                                в строке
                                FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll);

                                ну дык всё правильно… переправь модуль, а вернее функцию FindAndReplace

                                ExpandedWrap disabled

                                  function FindAndReplace(FindText, ReplacementText:string):boolean;

                                  const

                                     wdReplaceAll=2;

                                  begin

                                    Word.Selection.Find.Text := FindText;

                                    Word.Selection.Find.Replecement.Text := ReplacementText;

                                    FindAndReplace := Word.Selection.Find.Execute(Replace := wdReplaceAll);

                                  end;

                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                                0 пользователей:

                                • Предыдущая тема
                                • Delphi: Система, Windows API
                                • Следующая тема

                                [ Script execution time: 0,0413 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:38 GMT ]  

                                 
                                sapsi
                                 
                                (2005-02-04 13:20)
                                [0]

                                Добрый день.
                                Как реализовать сабж?
                                Делаю примерно следующее:

                                  wordapp:=CreateOleObject(«word.Application»);
                                  worddoc:=wordApp.documents.Add;
                                  wordapp.Selection.WholeStory;
                                  worddoc.Content.Find.ClearFormatting;
                                  worddoc.Content.Find.Replacement.ClearFormatting;
                                  worddoc.Content.Find.Text:=»111″;
                                  worddoc.Content.Find.Replacement.Text:=»222″;
                                  worddoc.Content.Find.MatchCase:= False;
                                  worddoc.Content.Find.Execute(wdReplaceAll);

                                не ищет «111», пробовал и по-другому, что-то вроде:

                                worddoc.Content.Find.execute(text:=»111″,ReplaceWith:=»222″,replace:=wdReplaceAll);

                                Все равно не работает.
                                Кто подскажет почему?
                                Спасибо.


                                 
                                Alezy ©
                                 
                                (2005-02-04 17:19)
                                [1]

                                Надо просто пользоваться правильными свойствами объектной модели MS Word. Ниже приведен пример замены, реализованный на VBA, думаю перевести его на Delphi не составит никакого труда. Вообще автоматизацию офиса лучше изучать с помощью VBA и переносить готовые куски кода в другие среды разработки.

                                Sub TestReplace()
                                 Dim wordApp As Word.Application
                                 Dim worddoc As Word.Document
                                 Set wordApp = CreateObject("word.Application") "создаем объект Word
                                 Set worddoc = wordApp.Documents.Add "создаем новый документ

                                   With wordApp.Selection "добавляем в документ данные!!!
                                   .TypeText Text:="Test1111Test"
                                   .TypeParagraph
                                   .TypeText Text:="Test2222Test"
                                   .TypeParagraph
                                   .TypeText Text:="Test3333Test"
                                 End With

                                   With wordApp.Selection.Find "заполняем опции замены
                                   .ClearFormatting
                                   .Replacement.ClearFormatting
                                   .Text = "111"
                                   .Replacement.Text = "222"
                                   .Wrap = wdFindContinue
                                   .Format = False
                                   .MatchCase = False
                                   .MatchWholeWord = False
                                   .MatchWildcards = False
                                   .MatchSoundsLike = False
                                   .MatchAllWordForms = False
                                   .Execute Replace:=wdReplaceAll "меняем всё
                                 End With
                                 worddoc.SaveAs ("c:AAA.doc") "сохраняем результаты или получем их другим способом
                                 worddoc.Close "закрываем документ!!!
                                 Set wordApp = Nothing "выгружаем Word
                                End Sub


                                 
                                GanibalLector ©
                                 
                                (2005-02-06 22:31)
                                [2]

                                var WordApp:OleVariant;
                                begin
                                WordApp := CreateOleObject("Word.Application");
                                  try
                                  WordApp.Documents.Open("C:2.doc");
                                  wordapp.visible:=true;

                                   WordApp.Selection.Find.ClearFormatting;
                                   WordApp.Selection.Find.Replacement.ClearFormatting;
                                   WordApp.Selection.Find.Replacement.Text:="GanibalLector";
                                   WordApp.Selection.Find.Text := "L";
                                   WordApp.Selection.Find.Forward := True;
                                   WordApp.Selection.Find.Wrap := 1;
                                   WordApp.Selection.Find.Format := False;
                                   WordApp.Selection.Find.MatchCase := False;
                                   WordApp.Selection.Find.MatchWholeWord := False;
                                   WordApp.Selection.Find.MatchWildcards := False;
                                   WordApp.Selection.Find.MatchSoundsLike := False;
                                   WordApp.Selection.Find.MatchAllWordForms := False;

                                   WordApp.Selection.Find.Execute(Replace := 2);

                                  finally
                                    WordApp:=UnAssigned;
                                 end;

                                end;


                                uses 
                                  ComObj; 
                                 
                                // Replace Flags 
                                type 
                                  TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards); 
                                 
                                function Word_StringReplace(ADocument: TFileName;
                                SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean; 
                                const 
                                  wdFindContinue = 1; 
                                  wdReplaceOne = 1; 
                                  wdReplaceAll = 2; 
                                  wdDoNotSaveChanges = 0; 
                                var 
                                  WordApp: OLEVariant; 
                                begin 
                                  Result := False; 
                                 
                                  { Check if file exists } 
                                  if not FileExists(ADocument) then 
                                  begin 
                                    ShowMessage('Specified Document not found.'); 
                                    Exit; 
                                  end; 
                                 
                                  { Create the OLE Object } 
                                  try 
                                    WordApp := CreateOLEObject('Word.Application'); 
                                  except 
                                    on E: Exception do 
                                    begin 
                                      E.Message := 'Word is not available.'; 
                                      raise; 
                                    end; 
                                  end; 
                                 
                                  try 
                                    { Hide Word } 
                                    WordApp.Visible := False; 
                                    { Open the document } 
                                    WordApp.Documents.Open(ADocument); 
                                    { Initialize parameters} 
                                    WordApp.Selection.Find.ClearFormatting; 
                                    WordApp.Selection.Find.Text := SearchString; 
                                    WordApp.Selection.Find.Replacement.Text := ReplaceString; 
                                    WordApp.Selection.Find.Forward := True; 
                                    WordApp.Selection.Find.Wrap := wdFindContinue; 
                                    WordApp.Selection.Find.Format := False; 
                                    WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags; 
                                    WordApp.Selection.Find.MatchWholeWord := False; 
                                    WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags; 
                                    WordApp.Selection.Find.MatchSoundsLike := False; 
                                    WordApp.Selection.Find.MatchAllWordForms := False; 
                                    { Perform the search} 
                                    if wrfReplaceAll in Flags then 
                                      WordApp.Selection.Find.Execute(Replace := wdReplaceAll) 
                                    else 
                                      WordApp.Selection.Find.Execute(Replace := wdReplaceOne); 
                                    { Save word } 
                                    WordApp.ActiveDocument.SaveAs(ADocument); 
                                    { Assume that successful } 
                                    Result := True; 
                                    { Close the document } 
                                    WordApp.ActiveDocument.Close(wdDoNotSaveChanges); 
                                  finally 
                                    { Quit Word } 
                                    WordApp.Quit; 
                                    WordApp := Unassigned; 
                                  end; 
                                end; 

                                Понравилась статья? Поделить с друзьями:
                              • Delphi word to pdf
                              • Delphi select from excel
                              • Delphi range в excel что такое
                              • Delphi interface not supported excel
                              • Delphi if excel cell