Как добавить текст в word delphi

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

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из 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
голоса

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

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

procedure TForm1.Button1Click(Sender: TObject);

var Word: variant;

begin

try

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

except

ShowMessage(‘Не могу запустить Microsoft Word’);

end;

Word.Visible := True;

end;

Как создать новый документ Word в Delphi:

//Создание нового документа:

Word.Documents.Add;

Как открыть существующий документ Word в Delphi:

//Открытие существующего документа:

Word.Documents.Open(‘c:test.doc’);

Как добавить текст в документ Word в Delphi:

//Добавление текста в документ:

Word.Selection.TypeText(Text:=‘Новый текст’);

Как добавить абзац Word в Delphi:

//Добавление абзаца:

Word.Selection.TypeParagraph;

Как закрыть документ Word в Delphi:

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

Word.Quit;


0 / 0 / 0

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

Сообщений: 6

1

Другое

02.12.2017, 18:52. Показов 2270. Ответов 10


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

Вечер добрый форумчане!
Решил немного автоматизировать свою рабочую деятельность, и вот встал у меня вопрос, есть ли возможность из поля Memo вставить текст в открытое окно MS Word в то место где установлен был ранее курсор?
При этом вставлять текст необходимо с заменой. Например: Сертификат (1) ФСТЭК, за место (1) — вставить текст установленный в dbedit.
Просьба разъяснять по подробнее, далеко не программист… ЗА РАНЕЕ СПАСИБО!



0



3394 / 2045 / 654

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

Сообщений: 8,781

02.12.2017, 19:06

2

Ну дык скопируйте в буфер обмена текст и вставляйте. Зачем огород городить?



0



0 / 0 / 0

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

Сообщений: 6

02.12.2017, 19:08

 [ТС]

3

Есть еще коллеги которые могут работать с анализатором спектра, но не с ПК)) и одно нажатие кнопки все бы решило)



0



3394 / 2045 / 654

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

Сообщений: 8,781

02.12.2017, 19:11

4

Опишите исходную задачу несколько подробнее. Есть у меня подозрение, что вам просто надо в шаблоне вордовского документа в определенных позициях вставить текст из БД. Я прав?



0



0 / 0 / 0

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

Сообщений: 6

02.12.2017, 19:15

 [ТС]

5

Грубо говоря у меня есть отчет который постоянно меняется, и куча других документиков. Все эти документы объединяет одна общая информация сертификаты ФСТЭК ( номер, дата и тд.) данная программа это база данных этих сертификатов. Перед ней стоит следующая задача вставить шаблон который стоит в поле Memo в открытий текстовый документ а именно в то место где установлен (или был ранее установлен ) курсор.



0



Модератор

8382 / 5583 / 2275

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

Сообщений: 23,960

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

02.12.2017, 21:28

6

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

а именно в то место где установлен (или был ранее установлен ) курсор.

Вообще-то это делается так: в редакторе Ворд есть такой инструмент, как Закладка. Создаете документ Ворд, в котором на ключевых местах, куда должны быть вставлены данные из внешнего файла/БД, вставляете закладки с уникальными именами. Далее в своей программе получаете эти внешние данные и вставляете на места закладок.
Сейчас под рукой нет ни примера, ни Дельфи, но на форуме такие примеры имеются, воспользуйтесь поиском.

Не по теме:

А вообще-то, гораздо практичнее воспользоваться другим инструментом Ворд — слиянием документов. Весьма простой и удобный способ, без применения сторонних программ. Но это уже тема совсем другого раздела.



0



0 / 0 / 0

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

Сообщений: 6

02.12.2017, 22:45

 [ТС]

7

Смысл заключается в том что шаблона нету! Документ MS Word может быть любой открытый документ!



0



Пытливый

3394 / 2045 / 654

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

Сообщений: 8,781

03.12.2017, 01:57

8

Ну вот скажем вот так можно просто делать вставку в ворд:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
...
Uses ComObj;
...
var
  WordApp: OleVariant;
begin
 try
   WordApp := GetActiveOleObject('Word.Application');
   WordApp.Selection.Text := Memo1.Text;
 except
   ShowMessage('Не запущен Word!');
 end;

Возможно вам такого и хватит.



0



0 / 0 / 0

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

Сообщений: 6

03.12.2017, 12:49

 [ТС]

9

Спасибо то что нужно!
Может подскажите , как можно вставить в MS Word с условием замены например, (1)=dbedit1, (2)=dbedit2
т.е. Memo1 отображает: сертификат ФСТЭК (1) от (2)
а в MS Word вставятся следующее: Сертификат ФСТЭК 1572 от 22.11.2005



0



0 / 0 / 0

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

Сообщений: 6

03.12.2017, 13:54

 [ТС]

10

Дорогие друзья проблема решена спасибо большое! Выкладываю исходник может кому поможет!
ВСЕМ СПАСИБО!



0



Пытливый

3394 / 2045 / 654

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

Сообщений: 8,781

03.12.2017, 13:59

11

Помещаете вместо Memo на форму ListBox. В него загоняете ваши шаблоны замены в таком виде:
cертификат ФСТЭК (1) от (2);cертификат ФСТЭК 1572 от 22.11.2005
cертификат ФСТЭК (1) от (2);cертификат ФСТЭК 99 от 01.05.2010

По нажатию кнопки будет сделана

одна

замена текста в ворде на выбранный элемент списка.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure TForm44.Button1Click(Sender: TObject);
var
  WordApp: OleVariant;
  List: TStringList;
  S: String;
begin
 try
   WordApp := GetActiveOleObject('Word.Application');
   if ListBox1.ItemIndex = -1 then Exit;
   List := TStringList.Create;
   List.StrictDelimiter := True;
   List.Delimiter := ';';
   List.DelimitedText := ListBox1.Items[ListBox1.ItemIndex];
   WordApp.Selection.WholeStory;
   WordApp.Selection.Find.ClearFormatting;
   WordApp.Selection.Find.Text := List.Strings[0];
   WordApp.Selection.Find.Forward := True;
   if (WordApp.Selection.Find.Execute) and (WordApp.Selection.Text <> '')
   then WordApp.Selection.Text := List.Strings[1];
   List.Free;
 except
   ShowMessage('Не запущен Word!');
 end;
end;



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

03.12.2017, 13:59

11

Понравилась статья? Поделить с друзьями:
  • Как добавить текст в microsoft word
  • Как добавить текст в excel для нескольких ячеек
  • Как добавить табуляцию в excel
  • Как добавить табличку в excel
  • Как добавить таблицу к таблице в документ word