Delphi заполнение word шаблона

Обновлено: 04.07.2024

Известно, что Word является OLE-объектом. Суть OLE технологии - возможность из разрабатываемого приложения(клиента) взаимодействовать с другими приложениями(серверами). Все приложения Microsoft Office являются так называемыми "серверами автоматизации". Microsoft Word , являясь сервером OLE, позволяет подключаться к себе клиентам и использовать свои методы и свойства.

Алгоритм импорта данных в Word следующий:
1) создаем подключение к серверу-приложению Word,
2) создаем или открываем существующий документ
3) вносим в документ изменения
4) манипулируем документом, как хотим (сохраняем его, не показывая при этом экране или же наоборот),
5) отсоединяемся от сервера.

1) Подключение к серверу Word производится следующим образом:

var
Application: variant;
begin
Application:= CreateOleObject('Word.Application');
end;

Сначала вводим вариантную переменную, затем создаем объект OLE 'Word.Application' , и присваиваем его этой переменной. Эта процедура называется "создание экземпляра сервера". Создав этот объект, мы затем программируем его свойства и методы.

2) после создания экземпляра сервера, нужно либо создать новый документ, либо открыть уже имеющийся, дабы только что созданный экземпляр сервера не содержит документов и, следовательно информацию импортировать нам пока что некуда.

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

Создание документа производится методом Add :

Синтаксис метода: Add ( Template, NewTemplate, DocumentType, Visible)

Все параметры метода - типа Variant и необязательны,

Имя шаблона, по которому создается новый документ. Если значение не указано, то используется шаблон Normal. Если использовать значение True , то новый документ открывается как шаблон. Значение по умолчанию - False . Управляет видимостью созданного документа. Если указать значение True , то документ будет видим. По умолчанию Microsoft Word открывает документ с свойством Visible установленным в True .

Так как все параметры являются необязательными, то для создания нового документа по шаблону Normal метод можно применить без параметров:

Для создания нового документа по шаблону <Шаблон.dot> метод применяется следующим образом

Application.Documents.Add('C:\Program Files\
Microsoft OfficeD9\Шаблон.dot');

Например, создание нового документа в виде Web-страницы будет выглядеть как

Var
DocumentType: OleVariant;
Application:variant;
begin
Application:= CreateOleObject('Word.Application');
DocumentType:=wdNewWebPage;
Application.Documents.Add(EmptyParam,False,DocumentType,EmptyParam);


Все параметры в методах объявляются типа OleVariant . Если параметр не используется в методе, то вместо него указывается EmptyParam , что означает пустой параметр.

Открытие существующего документа Word реализуется методом Open.
Синтаксис метода:

Open (FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format, Encoding, Visible)

В параметре указывается имя файла документа, включая путь. Обязательный параметр.

Если в значении этого параметра указать значение True, то в случае открытия документа с форматом, отличного от Word, будет выводится диалоговое окно конвертирования файла. Необязательный параметр.

Указывая True , открываем документ только для чтения. Необязательный параметр.

Устанавливая значение в True , позволяем добавлять имя открываемого файла в список недавно открытых файлов в меню Файл . Необязательный параметр.

Пароль открываемого документа. Необязательный параметр.

Пароль открываемого шаблона. Необязательный параметр.

Параметр, предусмотренный для открытия файла с именем, уже открытого в данный момент. Если указать True то все изменения текущего документа не сохраняются и открывается файл с подобным именем. При значении False открытый файл активизируется, а новый не открывается. Необязательный параметр.

Пароль для сохраняемого документа. Необязательный параметр.

Пароль для сохраняемого шаблона. Необязательный параметр.

Конвертор файла, необходимый для открытия документа. Может принимать одно из следующих значений типа WdOpenFormat : wdOpenFormatAllWord , wdOpenFormatAuto , wdOpenFormatDocument , wdOpenFormatEncodedText , wdOpenFormatRTF , wdOpenFormatTemplate , wdOpenFormatText , wdOpenFormatUnicodeText , or wdOpenFormatWebPages . По умолчанию wdOpenFormatAuto . Необязательный параметр.

Кодировка для просмотра документа, может принимать любое правильное значение из ряда констант MsoEncoding . По умолчанию используется системная кодовая станица, установленная по умолчанию. Необязательный параметр.

Устанавливая True , предусматриваем видимое открытие документа. По умолчанию установлено True . Необязательный параметр.

Например, для открытия документа "c:\Example.doc" метод Open применяется как

Application.Documents.Open('c:\Example.doc');

а для файла "C:\Exam.doc" с паролем на открытие "1" как:

3) Все элементы рассматриваемого OLE объекта являются так называемыми коллекциями. Коллекция - есть объект, содержащий специфический набор методов и свойств. Коллекция похожа на динамический массив. В ней содержится набор объектов, которые обычно имеют один тип. Вы можете добавлять в нее элементы, удалять и получать их значения. Доступ к элементу осуществляется либо по его порядковому номеру, либо по его имени. Например, все открытые документы представляют собой коллекцию.

Обращение к документу

Обращение к открытому документу, как к элементу набора коллекции, можно по порядковому номеру методом Item. Например, обращение ко второму документу будет выглядеть как:


Нумерация всех элементов в коллекции начинается с единицы, а не с нуля.

Аналогичную операцию можно осуществить еще как.

Application.Documents(2);

Для работы с документом, его сначала нужно активизировать, т.е. передать ему фокус, подготовить для редактирования или других операций. Активизирование документа производится методом Activate . Для активизации документа, его нужно выбрать из коллекции по его порядковому номеру:

Application.Documents.Item(2).Activate;

или по имени файла:

Application.Document("C:\Example.doc").Activate;

к активному документу можно обращаться, используя свойство ActiveDocument , например, закрыть активный документ:

Application. ActiveDocument.Close;

3) Внесение изменений в документы.

Теперь настала очередь изучить иерархию методов и свойств OLE объекта.В упрощенном виде картина выглядит следующим образом:

Суть иерархии следующая: объект Application содержит коллекцию документов Documents , тот в свою очередь содержит коллекцию Paragraphs (абзацев), областей документа Range , таблиц Table , закладок Bookmark.

Вставка текста в документ

Далее по тексту мы в основном будем манипулировать коллекций объектов Range, т.е. весь текст удобно будет рассматривать как несколько непрерывных областей. Добавление текста осуществляется следующим образом: сначала создается объект Range, представляющий собой непрерывную область документа, затем методами этого объекта добавляется текст. Объект Range может объявляться как

выражение .Range (начало области, конец области)

например, объявленный ниже объект Range1 охватывает собой первые 10 символов второго документа.

var
Range1: variant;
begin
Range1:= Application.Documents(2).Range(1,10);
end;

В документе сначала можно создавать абзацы, т.е. объекты Paragraphs , и затем объединять их в области. К примеру, в начале активного документа методом Add объекта Paragraphs создаем новый абзац, затем на его основе создаем объект Range1:

var
Range1: variant;
begin
Application. ActiveDocument . Paragraphs.Add;
Range1:=Application.ActiveDocument.Paragraphs.Item(1).Range;
end;

Вставка текста производится двумя методами объекта Range: InsertAfter и InsertBefore.

Спецификация методов проста:

выражение .InsertAfter( текст) этим методом производится вставка текста после начала объекта Range
выражение .InsertBefore( текст) ,а этим - до.

при использовании этих методов, в качестве параметра указать нужно только текст в апострофах. К примеру, вызов двух операторов

Range1.InsertAfter('это текст InsertAfter');
Range1.InsertBefore('это вставленный текст InsertBefore');

даст нам две строки:

это вставленный текст InsertBefore
это текст InsertAfter

У объекта Range есть много полезных свойств, которые вам неплохо было бы узнать:

свойство Font (шрифт), которое имеет свои подсвойства:

Font .Bold:=True - жирность шрифта
Font .Name:="Arial"- название шрифта
Font .Size:= 24 - размер шрифта

Font .Color:= clRed - цвет шрифта

Font .Italic:= True - наклонность шрифта

Например, вставка жирной строки зеленого цвета:

Range1.Font.Bold:= True;
Range1.Font.Size:= 24;
Range1.Font.Size:= clGreen;
Range1.InsertAfter('вставленная строка');

Объект типа Range можно форматировать. Например, следующей строкой содержимое объекта Range выравнивается по центру:

Необходимо программно вставить данные из программы в шаблон документа MS Word и распечатать результат, при этом шаблон оставить прежним. Как это сделать, используя компоненты WordApplication и WordDocument?

Пример: есть шаблон pattern.doc, содержащий текст:
Фамилия:
Имя:

Нужно программно заполнить этот шаблон:
Фамилия: Иванов
Имя: Иван

И распечатать. После чего закрыть файл шаблона без изменений.

Открывать и писать в документы я научился. Печатать тоже, наверное, смогу. А как писать текст в ОПРЕДЕЛЕННЫЕ места документа? Самое первое что напрашивается, это сделать метки в шаблоне и осуществлять замену. Но метода вроде Replace ни где не нашел.

Буду очень благодарен за советы и примеры.

НА места куда надо вписать данные ставь таблички пустые, потом такой код

только кто нить знает как потом закрыть всё это корректно, без вопросов и без провисания сервака в памяти?

А что если уже в самом шаблоне есть таблицы? У меня именно такая ситуация. Причем заносить данные нужно не просто в пустые ячейки, а в ячейки содержащие уж какой-то текст. Поэтому я сразу пытался избежать обращения к таблицам, шаблон большой и посчитать где какая таблица - практически невыполнимая задача для меня.

Аналогичную задачу в Perl я всегда решал расстановкой меток в шаблоне, с последующей их заменой. Например:

Фамилия: %surname%
Имя: %name%

Затем используется простое регулярное выражение s/%surname%/Name/g, которое заменяет все метки %surname% на значение переменной Name. И т.д.

Неужели ничего подобного нет в сервере MS Word? Я имею ввиду не регулярные выражения естественно, а замену текста на текст. Можете есть еще какие-то объекты, которые можно заменять на текст?

Сейчас поищу на дельфикингдум.

ych_boriss, тут разговор о замене средствами VBS.

procedure TForm1.APrintExecute(Sender: TObject);
var
FileName, wdDoNotSaveChanges: OleVariant;
FindText, ReplaceText, OleFalse, OleTrue, Unknow: OleVariant;
begin
FileName := Directory + PatternFile;
try
WordApplication1.Connect;
WordApplication1.Visible := True;
try
WordApplication1.Documents.Add(FileName, EmptyParam,
EmptyParam, EmptyParam);

WordApplication1.Selection.Find.Execute(FindText, OleFalse, OleFalse,
OleFalse, OleFalse, OleFalse, OleTrue, Unknow, OleFalse, ReplaceText,
OleTrue, EmptyParam, EmptyParam, EmptyParam, EmptyParam);

Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью. Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Спасибо, попробую сегодня. А для чего тебе вообще из программы в Word пересылку делать? Отчеты что ли там формируют? Просто для этого вроде более удобные способы есть. Хотя заказчикам все подряд нужно. :-)

Интересует формирование отчётов не через OLE в ворд, а через создание XML документа, который ворд откроет.

Меня тоже интересует :) Попробую чего-нибудь написать по тому поводу

Очень интересный подход, а я в дельфи так и не смог этого сделать

Здравствуйте. Подскажите, пожалуйста, как подавить диалоговое окно на сохранение документа? Пол дня уже не могу сделать.

Про которое окно идет речь? Если про то, что выскакивает, когда Вы пытаетесь закрыть Ворд из своей программы, то при создании объекта надо написать так:
var Word: OLEVariant
begin
[. ]//создаем объект
Word.DisplayAlerts:=wdAlertsNone
end;
DisplayAlerts может принимать одно из следующих значений:
wdAlertsAll -1
wdAlertsMessageBox -2
wdAlertsNone 0

Вот привожу листинг из макроса, для вставки таблицы, то ничего не понятно.

Спасибо, через компоннеты не помогло, а тут все так просто)

srg91,
[code]Word.Quit;
UnAssigned(Word)[/code]

В Delphi-приложении вроде бы никак. Или я просто не встречал программ, способных такое сделать.

Понял, спасибо.
Еще вопрос есть.
RichEdit и RxRichEdit как-то странно ссылки в тексте отображают.
В открываемом RTF ссылки нормальные:
например:

а когда открываю RTF в своей программке, ссылки имеют такой вид:

Почему так? И можно ли привести их в нормальный вид?

Подскажите пожалуйтса.
У меня в программе нужно открыть Word на определенной закладке.
Когда работал в Delphi 7 я это сделал с помощью Ole,
Перешел на 2010 и не могу это сделать. И вообще нет компонентов с Word.
Подскажите плиз!

to Vlad
слушай подсади нубу как в ворде через делфи вставить ТАБ
такая команда не работает, а точнее компилятор не пропускает, команду взял из макроса:

[code]
var
word_stud:Variant;
word_stud.Selection.TypeText Text:=vbTab;
[/code]
За ранее спасибо!


подскажите пожалуйста:
мне необходимо записать из поля edit информацию в word при том, чтобы word он не открывался.
спасибо

можно просто не показывать видимость документа:
w.visible:=false;

В один документ надо вставить с определенной позиции весь текст другого документа. Как это сделать? Пишет слишком длинная строка.

НЕ подскажете можно ли из дельфи вставить и редактировать формулы в Word Т.е. работа с редактором формул. Или это не реально?

Через OLE-контейнеры вроде бы можно было, но сам никогда над такими вещами не работал

Понятно. Спасибо за отклик. Придется тогда шаблон использовать. А хотелось конечно все программно сделать

Подскажите, как можно создать базу данных, состоящую из документов word в delphi?

преподаватель задал вот такую задачку)

Помогите, не могу создать путь чтобы открыть документ

Word.Documents.Open(D:\. . . \. . . docx:=FilePath, ReadOnly:=true) Что тут не так.

Серега, всё не так. Во-первых почему первый параметр задом наперед стоит? Во-вторых, почему в пути к файлу кодировка сбита?

нахожу в документе нужное слово с помощью метода FIND объекта SELECTION. Как теперь перед найденным словом перевести каретку (аналогично нажатию клавиши ENTER)?
И ещё, как после нахождения искомого слова выделить следующий за ним фрагмент текста?
Заранее благодраю!

Спасибо! Я только только начал заниматься вопросами автоматизации обработки документов и сразу же встретился с массой трудностей. В инете ничего конкретного. Я был бы вам признателен, если бы вы подсказали мне какой-нибудь ресурс или ссылку на источник, где более или менее освещен данный вопрос (к слову, известная многим книга В.Корнякова мне не очень помогла).

Читайте также: