Доброго времени суток!
Сделал простенький компонент для замены текста в документах 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!
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Full Member Рейтинг (т): -1 |
У меня есть едит. И ворд. В ворде есть текст: @edit1@. Как мне |
volvo877 |
|
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Читал!!! Не могу понять!!! |
dron-s |
|
BIG-VL
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.
полностью рабочий, писал для собственных нужд… |
volvo877 |
|
Цитата BIG-VL @ 05.09.06, 08:10 Не могу понять!!! Что именно не понятно? |
dron-s |
|
хе, так это же мой модуль |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Блин не могу понять, а что именно не могу сказать потому чо всё! Этот модклю подключаю а дальше? |
dron-s |
|
подключаешь модуль, а дальше используешь его функции
CreateWord; OpenDocFile(‘путь к файлу’,»); FindAndReplace(‘что нужно заменить’,’на что нужно заменить’); VisibleWord; |
volvo877 |
|
Цитата BIG-VL @ 05.09.06, 08:32 что именно не могу сказать потому чо всё!
procedure TForm1.Button1Click(Sender: TObject); begin Word_StringReplace(‘C:Test.doc’,’@edit1@’,Edit1.Text, [wrfReplaceAll]); // Замени test.doc на имя своего файла end; |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Цитата dron-s @ 05.09.06, 08:42 подключаешь модуль, а дальше используешь его функции
CreateWord; OpenDocFile(‘путь к файлу’,»); FindAndReplace(‘что нужно заменить’,’на что нужно заменить’); VisibleWord; Во это уже лучше!!! Добавлено 05.09.06, 08:47 Цитата volvo877 @ 05.09.06, 08:45 Если пользуешься процедурой tIce — то: Это я не понял!!! |
dron-s |
|
Цитата volvo877 @ 05.09.06, 08:45 что именно не могу сказать потому чо всё! такое чувство, что BIG-VL не имеет не малейшего представления что к чему |
volvo877 |
|
BIG-VL Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ??? |
dron-s |
|
Цитата BIG-VL @ 05.09.06, 08:47 Во это уже лучше!!! и что, это тоже не работает? |
BIG-VL |
|
Full Member Рейтинг (т): -1 |
Цитата volvo877 @ 05.09.06, 08:49 BIG-VL Что, трудно на ник пользователя посмотреть, по той ссылке, которую я тебе дал? Или все время делать тебе Copy+Paste ??? Я смотрел… Цитата dron-s @ 05.09.06, 08:48 такое чувство, что BIG-VL не имеет не малейшего представления что к чему Если честно то да не пойму что к чему!!! Добавлено 05.09.06, 08:53 Цитата dron-s @ 05.09.06, 08:49 и что, это тоже не работает? Не могу сказать, не проверил ещё!!! Ща проверю и скажу!!! Добавлено 05.09.06, 08:55 [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’ в строке
FindAndInsert := Word.Selection.Find.Execute(Replace := wdReplaceAll); |
dron-s |
|
Цитата BIG-VL @ 05.09.06, 08:51 Когда подключил модуль то сказал он ошибка… [Ошибка] myword.pas(46): Undeclared identifier: ‘FindAndInsert’ в строке ну дык всё правильно… переправь модуль, а вернее функцию FindAndReplace
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;