Delphi как заменить в word текст

   Попросили меня доработать старый модуль, который генерирует клиентам компании письма в формате MS Word. Пользователи создают шаблоны, в которых расставляют названия полей, заключенные в служебные символы (например, #CONTRACT_NUM#, #FIO#, #ADDRESS#…). Программа по заданным критериям выбирает информацию о клиентах из базы и генерирует письма, находя в тексте шаблонов названия полей и заменяя их фактическими значениями.
   Если опустить все детали и различную логику, то упрощенно это выглядит так:

Var
  MSWord: OleVariant;
  i: Integer;
  q: TSDQuery;
  …
begin
  …
  MSWord := CreateOleObject(‘Word.Application’);
  MSWord.Documents.Add(‘какой то шаблон.dot’);
  For i := 0 to q.FieldCount-1 do
    MSWord.Selection.Find.Execute(FindText := ‘#’ + q.Fields[i].FieldName + ‘#’, ReplaceWith := q.Fields[i].AsString);
  …
  MSWord.ActiveDocument.SaveAs(‘письмо любимому клиенту.doc’);
  …

   Первое, с чем я столкнулся, это то, что длина значения параметра ReplaceWith не должна превышать 255 символов. Но это я обошел легко, заменив «поиск и замену текста» на «поиск и вывод текста»:

If MSWord.Selection.Find.Execute(FindText := ‘#’ + q.Fields[i].FieldName + ‘#’) then
  MSWord.Selection.TypeText(q.Fields[i].AsString);

   Вторая задачка оказалась сложнее. Внизу листа в фиксированное место необходимо было вывести фамилию и адрес получателя. Сначала я думал поместить его в нижний колонтитул, но оказалось, что письмо может быть на двух листах. Тогда ничего не оставалось, как использовать объект «заметка». Вставил «заметку». Красота! Документ генерируется, текст сдвигается, заметка остается на месте… Но радость была недолгой, т.к. поля #FIO# и #ADDRESS#, помещенные в заметку, так и остались незамененными :(
   Оказалось, что MSWord.Selection.Find.Execute ищет текст только в основной части документа, а в документе, состоящем из разных структурных элементов (заметок, колонтитулов, сносок и т.д.), поиск необходимо производить отдельно в каждом из этих элементов. Все эти структурные элементы документа являются элементами коллекции StoryRanges. Т.к. дело было к ночи, а модуль должен был быть готов к утру, я не стал разбираться, как работать со StoryRanges через OLE из Delphi, и просто добавил в тестовый шаблон письма макрос на VBA, в котором перебираются все структурные элементы активного документа, в которых ведется поиск:

Sub ReplaceText(sFindText As String, sReplaceText As String)
  Dim rngStory As Range
  For Each rngStory In ActiveDocument.StoryRanges
    With rngStory.Find
      .Text = sFindText
      .Replacement.Text = sReplaceText
      .Wrap = wdFindContinue
      .Execute Replace:=wdReplaceAll
    End With
  Next rngStory
End Sub

А в программе я только написал вызов макроса:

MSWord.Application.Run(‘ReplaceText’, ‘#FIO#’, ‘Иванов Иван Иванович’);

Работает как часы :)

P.S. После окончания генерации документа, если MS Word вам больше не нужен, то не забывайте закрывать его и высвобождать память

MSWord.Quit;
MSWord := UnAssigned;

P.P.S. Для подобной задачи генерации писем в формат MS Word больше подходит не поиск и замена текста, использование полей с переменными (DocVariable) и закладок (Bookmark). А как это сделать, я расскажу в следующий раз.

Slalom

4 / 4 / 0

Регистрация: 28.09.2012

Сообщений: 178

1

Поиск текста по документу и замена его на свой текст

28.09.2012, 09:38. Показов 12457. Ответов 13

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Пытаюсь сделать поиск с заменой текста в документе. Все работает но дело в том что он меняет лишь 1ну часть. Делаю след образом ищу текст типа такого $$ и меняю на свой текст. Он производит поиск только одного такого объекта $$ и дальше идти не хочет.. Может тема уже существует но решения тут я не нашел. Кто поможет заранее Благодарю.

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var Word: variant;
 
begin
try
Word := CreateOleObject('Word.Application');
Word.Documents.Add('C:Documents and SettingsАдминистраторМои документыfilesтитульный.doc').Activate;
     //Word.Selection.TypeText(Text:=Edit1.Text);
//Здесь поиск по надписям
Word.Selection.find.execute (FindText := '$FIO$', replacewith := edit1.Text);
Word.Selection.find.execute (FindText := '$Adres$', replacewith := edit2.Text);



1



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

28.09.2012, 10:37

2

Delphi
1
2
3
   // заменил первую строку
   word.selection.start := word.selection.end; // снимаешь выделение. Если надо искать с начала документа - то выставляешь start и end в 0
   // меняешь вторую строку и так далее ...



2



4 / 4 / 0

Регистрация: 28.09.2012

Сообщений: 178

28.09.2012, 11:21

 [ТС]

3

Спасибо. Почти. Но Почему то если объект в шаблоне указан выше первого объекта то его замену он не производит. А если наоборот или допустим один в 2х местах выше первого и ниже первого то 2ой меняется а тот который выше нет. Возможно есть другой метод реализации??? Или что то еще посоветуете?



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

28.09.2012, 11:25

4

Я же написал, если надо искать с начала текста (а если второй объект находится выше первого — то надо именно с начала, иначе текст не будет найден), то нужно сбросить start/end в нули.



2



4 / 4 / 0

Регистрация: 28.09.2012

Сообщений: 178

28.09.2012, 11:38

 [ТС]

5

Оп) Простите! Да поставил нулики. работает, но почему то замена производится только один раз, т. е. первое найденное $$ меняется а второе такое же нет.(( Почему? пжлст)

Добавлено через 2 минуты
Забегая далеко в перед, интересуюсь. Можно ли из этого в будущем сделать БД?



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

28.09.2012, 11:41

6

«Второе такое же» надо заменить на тот же текст? Тогда меняй не с wdReplaceOne, а с wdReplaceAll:

Delphi
1
2
3
4
5
6
   // ...
   wordapp.selection.find.Text := TextToFind;
   wordapp.selection.find.replacement.Text := NewText;
   wordapp.Selection.Find.Execute(Replace := wdReplaceAll);
   wordapp.selection.start := 0; wordapp.selection.end := 0;
   // ...



0



4 / 4 / 0

Регистрация: 28.09.2012

Сообщений: 178

28.09.2012, 11:50

 [ТС]

7

wdReplaceOne, а wdReplaceAll Где это такое писать?

Добавлено через 6 минут
Undeclared identifier: ‘wdReplaceAll’ Вот что пишет(



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

28.09.2012, 11:59

8

Модуль WordXP (или какой там у тебя Word установлен) подключен в Uses? Можно определить константами, если не хочется подключать:

Delphi
1
2
3
const
   wdReplaceOne = 1;
   wdReplaceAll = 2;



2



4 / 4 / 0

Регистрация: 28.09.2012

Сообщений: 178

28.09.2012, 12:14

 [ТС]

9

Огромное спасибо!!! Работает как надо))) А как же на счет

бд

? можно присобачить?

Добавлено через 2 минуты
Тема наверно будет востребована в поисовике) Потому что где искал ответов так и не было. А тут проблема решена!!



0



0 / 0 / 0

Регистрация: 22.05.2013

Сообщений: 5

22.05.2013, 12:36

10

Здраствуй. Воспользовался данной темы для написания своей программки, однако не открывает Word-файл с измененными данными.
В процессах оно пишет, что он открыт, но в активных окнах его нет.
Подскажите пожалуйста в чем может быть проблема.



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

22.05.2013, 12:46

11

Может, лучше присоединить тестовый проект? «Вот исходный файл, вот программа, жмем кнопку, значения меняются, после этого открываем измененный DOC — не открывается», чтобы можно было откомпилировать, запустить, и увидеть проблему, а не гадать, что же там такое понаделано, что оно не работает?



1



0 / 0 / 0

Регистрация: 22.05.2013

Сообщений: 5

22.05.2013, 12:55

12

Цитата
Сообщение от UI
Посмотреть сообщение

Может, лучше присоединить тестовый проект? «Вот исходный файл, вот программа, жмем кнопку, значения меняются, после этого открываем измененный DOC — не открывается», чтобы можно было откомпилировать, запустить, и увидеть проблему, а не гадать, что же там такое понаделано, что оно не работает?

Вот мой тестовый вариант



0



volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32516 / 20997 / 8120

Регистрация: 22.10.2011

Сообщений: 36,264

Записей в блоге: 7

22.05.2013, 13:12

13

Я с docx дела не имею, мой Word их не понимает (использую OfficeXP, а не новомодные, обсыпанные мишурой ненужной), с DOC-ом все нормально работает, если сохранить файл и закрыть Word, как положено, а не оставлять его висеть в процессах:

Delphi
1
2
3
word.ActiveDocument.saveAs(fn);
word.Quit;
word:= Unassigned;

после замены текста.



2



0 / 0 / 0

Регистрация: 22.05.2013

Сообщений: 5

22.05.2013, 14:23

14

Спасибо за помощь!!!



0



уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).

Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:

uses ComObj;
var Word: variant;
[...]
procedure CreateWord(const Visible: boolean);
begin
  Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
end;

Всё достаточно просто. Далее мы можем работать с объектом следующим образом:

  1. Создавать документ Word с нуля
  2. Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.

Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.

Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:

[...]
Word.Documents.Add
[...]

и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:

[...]
Word.Documents.Add(TamplatePath:string);
[...]

Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:

[...]
var List: TStringList;
    i: integer;
begin
  List:=TStringList.Create;
  for i:=1 to Word.Documents.Count do
    List.Add(Word.Documents.Item(i).Name);
end;
[...]

Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:

Word.Documents.Item(index).Activate

где index — номер документа в коллекции.

Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.

Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:

[...]
Word.ActiveDocument.Range.InsertBefore('Hello World');
Word.ActiveDocument.Range.InsertAfter('текст после Hello World');
Word.ActiveDocument.Range.InsertAfter('окончание строки в документа');
[...]

При выполнении этих трех операции Range содержал весь документ.

Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:

var MyRange: variant;
begin
  MyRange:=WordActiveDocument.Range(50,100);
  MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо
end;

Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:

[...]
ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе
[...]

Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.

Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.

[...]
  ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text)
[...]

В данном случае я вывел на экран последнее слово в документе.

Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.

2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.

Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:

var FilePath: string;
[...]
  Word.Documents.Open(FilePath)
[...]

Метод Open можно вызывать с несколькими аргументами:

  • FileName: string — путь и имя файла;
  • ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
  • ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
  • AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
  • PasswordDocument: string — пароль для открытия документа
  • PasswordTemplate: string — пароль для открытия шаблона
  • Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
  • WritePasswordDocument: string — пароль для сохранения измененного документа в файле
  • WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
  • Format:integer — формат открываемого документа.

Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:

[...]
  Word.Documents.Open(FileName:=FilePath, ReadOnly:=true)
[...]

В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.

Что касается последнего аргумента — Format, то он может принимать  целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.

Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:

function FindAndReplace(const FindText,ReplaceText: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:=ReplaceText;
  FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.

Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? :) Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet :)

3.1
8
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

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

Сделал простенький компонент для замены текста в документах 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,0406 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                                I would like to search in a word header and footer for specific words, and then replace them with words from my database.

                                Currently i can search and replace words anywhere in the word document except for the header and footer.

                                Can anybody help me with this?

                                Code for normal search(that works):

                                Procedure FindAndReplace(Find,Replace:String);
                                Begin
                                      //Initialize parameters
                                  WrdApp.Selection.Find.ClearFormatting;
                                  WrdApp.Selection.Find.Text := Find;
                                  WrdApp.Selection.Find.Replacement.Text := Replace;
                                  WrdApp.Selection.Find.Forward := True;
                                  WrdApp.Selection.Find.Wrap := wdFindContinue;
                                  WrdApp.Selection.Find.Format := False;
                                  WrdApp.Selection.Find.MatchCase :=  False;
                                  WrdApp.Selection.Find.MatchWholeWord := wrfMatchCase in Flags;
                                  WrdApp.Selection.Find.MatchWildcards :=wrfMatchWildcards in Flags;
                                  WrdApp.Selection.Find.MatchSoundsLike := False;
                                  WrdApp.Selection.Find.MatchAllWordForms := False;
                                     { Perform the search}
                                  if wrfReplaceAll in Flags then
                                   WrdApp.Selection.Find.Execute(Replace := wdReplaceAll)
                                  else
                                   WrdApp.Selection.Find.Execute(Replace := wdReplaceOne);
                                End;
                                

                                Code for header and footer search(doesnt work):

                                WrdApp.Selection.Find.ClearFormatting;
                                      WrdApp.Selection.Find.Text := 'Class';
                                      WrdApp.Selection.Find.Replacement.Text := grade;
                                      WrdApp.Selection.Find.Forward := True;
                                      WrdApp.Selection.Find.Wrap := wdFindContinue;
                                      WrdApp.Selection.Find.Format := False;
                                      WrdApp.Selection.Find.MatchCase :=  False;
                                      WrdApp.Selection.Find.MatchWholeWord := wrfMatchCase in Flags;
                                      WrdApp.Selection.Find.MatchWildcards :=wrfMatchWildcards in Flags;
                                      WrdApp.Selection.Find.MatchSoundsLike := False;
                                      WrdApp.Selection.Find.MatchAllWordForms := False;
                                     { Perform the search}
                                  if wrfReplaceAll in Flags then
                                    WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Find.Execute(Replace := wdReplaceAll)
                                  else
                                    WrdApp.ActiveDocument.Sections.Item(1).Headers.Item(wdHeaderFooterPrimary).Range.Find.Execute(Replace := wdReplaceOne);
                                

                                Понравилась статья? Поделить с друзьями:
                              • Delphi если файл excel не открыт
                              • Delphi если excel открыт то закрыть
                              • Delphi если excel не установлен
                              • Delphi добавить строку в excel
                              • Delphi фильтр как в excel