Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2020, 17:20   #1
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию Замена текста в MS Word

Ниже приведенный код находит строку и заменяет ее, но только в основной части документа.
Прошу пожалуйста помочь как реализовать обращение к таблице в верхнем колонтитуле для выполнения замены текста там. Этот код в таблице колонтитула найти заменяемый текст не позволяет.
Код:
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Word_StringReplace('C:\Test.doc', 'Old String', 'New String',
    [wrfReplaceAll]);
end;
cb251132 вне форума Ответить с цитированием
Старый 27.03.2020, 22:31   #2
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

cb251132,
Макрос, если эту замену выполнять вручную в Ворд через стандартную функцию "Найти и заменить", кстати абсолютно без каких-либо проблем работающую даже с колонтитулами, выглядит так:
Код:
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "SearchString"
        .Replacement.Text = "ReplaceString"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Что абсолютно точно воспроизведено в программном коде. Что не так? Почему код не отрабатывает замену? Получается результатом выполнения Find.Execute является ложное значение. Ничего не понимаю, с текстом кроме колонтитулов код работает, а с колонтитулами не хочет.
Изображения
Тип файла: png 23.png (5.3 Кб, 19 просмотров)

Последний раз редактировалось cb251132; 28.03.2020 в 14:23. Причина: добавление фразы
cb251132 вне форума Ответить с цитированием
Старый 29.03.2020, 09:39   #3
cb251132
Пользователь
 
Регистрация: 29.06.2008
Сообщений: 23
По умолчанию

Задачу удалось решить добавлением строки в имеющийся код.
Код:
{ Initialize parameters}
   WordApp.ActiveWindow.ActivePane.View.SeekView := 9;
Чудо свершилось, код работает так как от него и ожидалось.
cb251132 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с word на c#, поиск/замена текста roshchik97 C# (си шарп) 0 28.05.2019 15:41
Замена текста в word из delphi Cannibal Общие вопросы Delphi 0 15.09.2013 11:14
Замена текста в Word Mermaid Помощь студентам 0 10.05.2011 16:50
Поиск и замена текста в надписях Word shakycucumber Общие вопросы Delphi 2 19.04.2011 02:18