уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из 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;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод 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
Вечер добрый форумчане!
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 |
а именно в то место где установлен (или был ранее установлен ) курсор. Вообще-то это делается так: в редакторе Ворд есть такой инструмент, как Закладка. Создаете документ Ворд, в котором на ключевых местах, куда должны быть вставлены данные из внешнего файла/БД, вставляете закладки с уникальными именами. Далее в своей программе получаете эти внешние данные и вставляете на места закладок. Не по теме: А вообще-то, гораздо практичнее воспользоваться другим инструментом Ворд — слиянием документов. Весьма простой и удобный способ, без применения сторонних программ. Но это уже тема совсем другого раздела.
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 |
|||
Ну вот скажем вот так можно просто делать вставку в ворд:
Возможно вам такого и хватит.
0 |
0 / 0 / 0 Регистрация: 11.09.2015 Сообщений: 6 |
|
03.12.2017, 12:49 [ТС] |
9 |
Спасибо то что нужно!
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. В него загоняете ваши шаблоны замены в таком виде: По нажатию кнопки будет сделана одна замена текста в ворде на выбранный элемент списка.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
03.12.2017, 13:59 |
11 |