Как сделать поиск/замену в документе?
Материал из DRKB
Используйте OleVariant потому что Find.Execute немного глючит. Например:
var
Rnge: OleVariant;
begin
Rnge := Doc.Content;
Rnge.Find.Execute('old', Wrap := wdFindContinue, ReplaceWith := 'new', Replace := wdReplaceAll);
end;
ID: 04429
{ Create the OLE Object }
WordApp := CreateOLEObject('Word.Application');
WordApp.Documents.Open(yourDocFile);
WordApp.Selection.Find.ClearFormatting;
WordApp.Selection.Find.Text := yourOldStr;
WordApp.Selection.Find.Replacement.Text := yourNewStr;
WordApp.Selection.Find.Forward := True;
WordApp.Selection.Find.Wrap := 1; { wdFindContinue }
WordApp.Selection.Find.Format := False;
WordApp.Selection.Find.MatchCase := False;
WordApp.Selection.Find.MatchWholeWord := False;
WordApp.Selection.Find.MatchWildcards := True;
WordApp.Selection.Find.MatchSoundsLike := False;
WordApp.Selection.Find.MatchAllWordForms := False;
WordApp.Selection.Find.Execute(Replace := 2); { wdReplaceAll }
{ Как вариант: WordApp.Selection.Find.Execute(Replace := 1); для однократной замены }
WordApp.ActiveDocument.SaveAs(yourNewDocFile);
WordApp.Quit;
WordApp := Unassigned;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04430
{ **** UBPFD *********** by kladovka.net.ru ****
>> Заменить строки в файле Word
Функция заменяет файлы в документе word с опциями поиска и замены
Зависимости: ComObj
Автор: [NIKEL], nikel@pisem.net, Norilsk<br>
Copyright: Some help
Дата: 15 сентября 2002 г.
********************************************** }
uses ComObj;
// Флаги замены
type
TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);
function WordStringReplace(ADocument: TFileName; SearchString,
ReplaceString: string; Flags: TWordReplaceFlags): Boolean;
const
wdFindContinue = 1;
wdReplaceOne = 1;
wdReplaceAll = 2;
wdDoNotSaveChanges = 0;
var
WordApp: OLEVariant;
begin
Result := False;
{ Существует ли файл }
if not FileExists(ADocument) then
begin
ShowMessage('Файл не найден!');
Exit;
end;
{ Создаем OLE объект }
try
WordApp := CreateOLEObject('Word.Application');
except
on E: Exception do
begin
E.Message := 'Word недоступен';
raise;
end;
end;
try
{ Прячем Word }
WordApp.Visible := False;
{ Открываем документ }
WordApp.Documents.Open(ADocument);
{ Инициализируем параметры}
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;
{ Ищем}
if wrfReplaceAll in Flags then
WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
else
WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
{ Сохраняем word }
WordApp.ActiveDocument.SaveAs(ADocument);
{ Всё нормально }
Result := True;
{ Закрываем document }
WordApp.ActiveDocument.Close(wdDoNotSaveChanges);
finally
{ Закрываем Word }
WordApp.Quit;
WordApp := Unassigned;
end;
end;
Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
begin
WordStringReplace('C:\SomeStrangeDoc.doc', 'Маша ела кашу', 'Маша съела кашу :)', [wrfReplaceAll]);
end;
Author: [NIKEL]
ID: 04431