Zeroes and Ones - портал высоких технологий - Программирование MS Word с помощью стандартных компонентов WordApplication, WordDocument ( ЧАСТЬ 1 )
Новости
Главная
Software
Hardware
Mobile
Наши новости
Техника
Электроника
Программирование
Delphi
HTML / CSS
*NIX
Дополнительно
О нас
Контакты
Последние новости

 


Опросы

Я за процессоры:



Популярное


Реклама


Партнеры
Программирование MS Word с помощью стандартных компонентов WordApplication, WordDocument ( ЧАСТЬ 1 )
Автор Albinos_X   
06.05.2007 г.

 Наверное многие программисты сталкивались с такой проблемой, как создание отчёта. Репортинговых систем сейчас предостаточно, но всё таки, если нужно использовать или включать как дополнительную опцию для вывода отчёта установленный на компьютере заказчика MS Word. Или наоборот нужно не выводить данные в документ, а брать оттуда какие либо данные, автоматизировать обработку данных хранящихся в документе.
Данная статья поможет Вам разобраться в принципах работы с MS Word, сэкономить Ваше драгоценное время и полезна для ознакомления не только начинающим, но и опытным программистам. Статья периодически обновляется, добавляются новые нюансы, способы работы с документом и примеры.

В этой части описывается:

  • Запуск и соединение с сервером Word;
  • Работа с документом;
  • Отключение проверки синтаксиса и грамматики;
  • Открытие документа;
  • Вставка и форматирование текста;
  • Установка Абзац - интервал;
  • Установка Межстрочный интервал;
  • Копирование текста;
  • Вставка текста;
  • Работа с параграфами (абзацами);


Работа с компонентой WordApplication, производится как с любым объектом Delphi. Кидаем его на форму. В инспекторе объектов мы наблюдаем свойства:
ConnectKind – определяет, как осуществляется соединение с сервером и может принимать следующие значения:

ckNewInstance - всегда создавать новый экземпляр сервера
ckRunningOrNew - присоединиться к выполняемому серверу или создать новый экземпляр
ckRunningInstance - Только присоединиться к выполняющемуся серверу
ckRemote - Присоединиться к удалённому серверу Сочетается со свойством RemoteMachineName
ckAttachToInterface - не присоединяться к серверу. Вместо этого приложение обеспечивает интерфейс методом ConnectTo

AutoConnect - определяет, должен ли запускаться сервер при запуске приложения
AutoQuit - обеспечивает автоматическое закрытие Word-а при завершении приложения
RemoteMachineName - Удалённый компьютер, на котором выполняется сервер и к которому необходимо присоединиться

Запуск и соединение
Запуск и соединение с сервером можно произвести несколькими вариантами. Например одним из вышеописанных свойств:

WordApplication1.AutoConnect:=true;

или с помощью имеющегося метода Connect:

WordApplication1. Connect;

При чём, можно сразу определить видимым ли будет приложение или нет:

WordApplication1.Visible:=True;

Эту же операцию можно произвести в любом месте кода, после запуска сервера. Соответственно перед запуском сервера желательно указать и как ему соединяться:



WordApplication1.ConnectKind := ckNewInstance;
WordApplication1.AutoConnect:=True;
WordApplication1.Visible:=True;
 
Работа с документом
Для работы с документом обращения к необходимому документу есть свойство ActiveDocument - активный документ. Это объект Document. Также к документу можно обращаться через свойство Documents, представляющее из себя массив открытых в данный момент документов (Document). Соответственно у этого свойства есть свойство Count, показывающая общее количество открытых документов. Свойство только для чтения и используется для проверки, есть ли хоть один открытый документ. Создание нового документа осуществляется методом Add:

WordApplication1.Documents.Add(Param1, Param2, Param3, Param4);

Param1 - указывает шаблон, который используется при создании документа, если параметр по умолчанию (EmptyParam), то используется Обычный(Normal)
Param2 - определяет, открывается документ как шаблон или как обычный документ, и имеет булевый тип. При значении (по умолчанию) False открывается как обычный документ .
Param3 - тип документа, и может принимать следующие значения: wdNewBlankDocument - новый пустой документ, wdNewEMailMessage - Новое электронное сообщение, wdNewFrameset - новый фрейм, wdNewWebPage - Новая Веб страница. По умолчанию (EmptyParam) используется wdNewBlankDocument.
Param4 – определяет, открывается ли документ в видимом окне или нет. По умолчанию равен True - в видимом.

Причём, четыре параметра имеются в Word от версии 2000, версии ниже имеют только первых два параметра, т.е. для Word97 нам надо писать:

WordApplication1.Documents.Add(EmptyParam, EmptyParam);

Компонент позволяет и произвести настройки документа. Такие как Установка параметров страницы (листа)

...
// книжная ориентация
WordApplication1.ActiveDocument.PageSetup.Orientation:=wdOrientPortrait;
// поля
WordApplication1.Selection.PageSetup.LeftMargin:=72.0; //~2.5 см
// A3
WordApplication1.ActiveDocument.PageSetup.PageWidth:=
WordApplication1.CentimetersToPoints(29.7);
WordApplication1.ActiveDocument.PageSetup.PageHeight:=
WordApplication1.CentimetersToPoints(42);
...


Отключить проверку синтаксиса и грамматики



...
// Синтаксис
WordApplication1.Options.CheckSpellingAsYuoType:=False;
// Грамматика
WordApplication1.Options.CheckGrammarAsYuoType:=False;
...
 
И другие настройки по аналогии.

Открытие документа
Соответственно для открытия документа имеется метод Open:


f:=OpenDialog1.FileName;
WordApplication1.ConnectKind:=ckNewInstance;
WordApplication1.AutoQuit:=false;
WordApplication1.Visible:=true;
WordApplication1.AutoConnect:=true;
WordDocument1.ConnectTo(WordApplication1.Documents.Open( f, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam));


а также, для Word XP и 2003 работает метод:

...
var
fil:OleVariant;
...
fil:='C:\мои документы\тест.doc';
WordApplication1.Documents.OpenOld(fil, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam,
EmptyParam);
...


Так же хочу отметить, что не стоит пренебрегать такими компонентами как WordDocument. Их использование в паре помогает избегать в некоторых ситуациях неприятностей. Таких как например, вставка текста не в желаемый документ, а другой открытый параллельно пользователем и т.п..

Вставка и форматирование текста
Важным свойством WordApplication является свойство Selection - указывающий на позицию курсора или выделенный фрагмент текста в активном документе. Для вставки текста имеются методы InsertAfter и InsertBefore. Первый вставляет текст после объекта Selection, второй - перед ним.

...
WordApplication1.Selection.InsertAfter('ОТЧЁТ ' +Edit1.Text+#13);
...


символ #13 переведёт курсор на новую строку и означает конец абзаца. Стоит отметить, что данные функции имеют ограничение на размер передаваемой строки, которая не должна превышать 255 символов, если же вставка текста происходит через переменную или объект, то проблем с ограничениями не возникает.

...
WordApplication1.Selection.InsertAfter(Memo1.Text +#13);
...


Выделенный текст мы можем отформатировать. Для этого у Selection есть ряд свойств. К примеру Font и ParagraphFormat. В Delphi, для удобства работы предусмотрены на той же вкладке (Servers) компоненты WordParagraphFormat и WordFont. Для подключения этих объектов к соответствующему объекту будем использовать метод ConnectTo:

...
// для перемещения курсора в конец при снятии выделения
D:=wdCollapseEnd;
// вставляем текст
WordApplication1.Selection.InsertAfter('текст'+#13);
// соединяемся с сервером шрифта
WordFont1.ConnectTo(WordApplication1.Selection.Font);
// устанавливаем размер шрифта
WordFont1.Size:=14;
// жирный
WordFont1.Bold:=1;
// курсив
WordFont1.Italic := 1;
// соединяемся с сервером формата
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
//отступ первый (абзац)
WordParagraphFormat1.FirstLineIndent:=35;
// текст по ширине
WordParagraphFormat1.Alignment := wdAlignParagraphJustify;
// снимаем выделение
WordApplication1.Selection.Collapse(D);
...


Подобно происходит и Установка Абзац - интервал

...
// для перемещения курсора в конец при снятии выделения
D:=wdCollapseEnd;
// вставляем текст
WordApplication1.Selection.InsertAfter('текст'+#13);
// соединяемся с сервером формата
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);
// интервал перед абзацем
WordParagraphFormat1.SpaceBefore:=40;
// интервал после абзаца
WordParagraphFormat1.LineSpacing:=40;
// снимаем выделение
WordApplication1.Selection.Collapse(D);
...


Межстрочный интервал
Устанавливается:

...
WordParagraphFormat1.LineSpacing:=20.00;
...


Аналогично можно узнать межстрочный интервал:

...
Label1.Caption:=FloatToStrF(WordParagraphFormat1.LineSpacing,ffNumber,5,2);
...


Для вставки текста имеется ещё один очень интересный метод TypeText. Но его работа немного отличается от ранее описанного и зависит от свойства ReplaceSelection, принадлежащее свойству Options. Если RepleceSelection:= true, то выделение заменяется на указанный текст, если false, то новый текст вставляется перед выделением:

...
WordApplication1.Options.RepleceSelection:=true;
WordApplication1.Selection.TypeText('ОТЧЁТ');
...


в результате выполнения кода выделенный текст заменится на слово "ОТЧЁТ".
Для вставки из буфера обмена у Selection есть метод Paste, который так же зависит от ReplaceSelection. Также можно и копировать, для чего есть тоже соответствующий метод. Для того, чтобы чего-нибудь скопировать надо это выделить. Например:
Выделить всю строку в документе:

...
var L, E: OleVariant;
begin
L:=wdLine;
E:=wdExtend;
// в конец строки
WordApplication1.Selection.EndKey(L,E);
...


или

...
var L, E: OleVariant;
begin
L:=wdLine;
E:=wdExtend;
// в начало строки
WordApplication1.Selection.HomeKey(L,E);
...


Скопировать

...
WordApplication1.Selection.Copy;
...


Вставить

...
WordApplication1.Selection.PasteAndFormat(wdPasteDefault);
...


Можно вместо wdPasteDefault ставить EmptyParam.
Навигация по тексту происходит наподобие выделению:
Переместиться в конец текста:

...
var L: OleVariant;
begin
L:=wdStory;
// в конец текста
WordApplication1.Selection.EndKey(L, EmptyParam);
...


Как Вы уже наверно заметил в одном из приведённых выше примеров я использовал ещё одно важное свойство метода Selection - Collapse - данный метод свертывает выделение, передаваемый в него аргумент определяет позицию курсора после свёртывания. Аргумент может принимать значения wdCollapseEnd и wdCollapseStart, помещение курсора в конец или в начало выделения соответственно. По умолчанию (EmptyParam) равен wdCollapseStart.
Также для работы с текстом мы можем использовать объекты Range - соответствует какому-то непрерывному участку текста.

...
var Rang, Start, End:OleVariant;
...
Start:=1;
Endr:=15;
Rang:=WordDocument1.Range(Start, Endr);
...


после выполнения этого кода объект Rang будет соответствовать первым 15 символам текста. По свойствам данные объекты схожи со свойствами Selection, поэтому подробно описывать его не буду.

Ещё одно свойство, позволяющее работать с текстом - Paragraphs – абзац (параграф)
Итак, добавить мы его можем методом Add:
Добавить новый параграф

...
WordApplication1.ActiveDocument.Paragraphs.Add(EmptyParam);
...


Работа с Абзацем (Параграфом) соответственно производится через свойство Paragraphs

..
WordApplication1.ActiveDocument.Paragraphs....
...


т.е. количество параграфов будет:

...
col:=WordApplication1.ActiveDocument.Paragraphs.Count;
...


Количество абзацев в выделенном фрагменте будет

...
col:=WordApplication1.Selection.Sentences.Count;
...



Получить доступ к тексту параграфа можно так:

...
L:=TStringList.Create;
// номер читаемого параграфа
i:=10;
// количество абзацев
col:=WordApplication1.ActiveDocument.Paragraphs.Count;
// если количество абзацев больше чем номер читаемого параграфа
if i<=col then
begin
// получаем текст параграфа
L.Text:=WordApplication1.ActiveDocument.Paragraphs.Item(i).Range.Text;
...


стоит также отметить, что у Paragraphs есть полезные методы First, Last - первый и последний абзац соответственно:

...
WordApplication1.ActiveDocument.Paragraphs.First;
...
WordApplication1.ActiveDocument.Paragraphs.Last;
...


теперь немного пояснений:

в строке имеются непечатные символы обозначающие конец абзаца , поэтому когда документ пуст в нем как минимум есть один пустой абзац. Имеется и ряд других символов форматирования: 2 (#13#7) символа в таблице, 1 - в обычном тексте (#13), рисунок если вставлен в контейнер "создайте рисунок" идёт как 2 символа (#1#21) и опять же конец абзаца #13, т.е. в абзац можно разместить несколько рисунков или рисунок и текст, тогда полученная строка будет равна : "#1#21ТЕКСТ#13"
таблица представляется в виде нескольких абзацев... приблизительно так:
таблица 2х3

|__абзац__|__абзац__|__абзац__|абзац
|__абзац__|__абзац__|__абзац__|абзац

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

WordApplication1.ActiveDocument.Paragraphs.Count

колонтитулы за абзац не принимаются. Рисунок не вставленный в контейнер "создайте рисунок" как абзац не идет. Ещё один символ форматирования текста - #12 (представлен как ‘^m’) – вставленную страницу через разрыв.

Отмечу ещё одно важное свойство Document – Content. С помощью него можно получить доступ ко всему содержанию документа. Имеет тип Range и все действия для него адекватны и для Content. Например:

...
Memo1.Text:=WordDocument1.Content.Text;
...


Код копирует текстовое содержание документа в Memo1. Переменная Text - принимает значение WideString. Но стоит отметить, что текст перенесётся вместе с символами форматирования, о которых я упоминал ранее.


Продолжение следует...

СУВ, Albinos_X (С)
Задать вопрос или связаться со мной можно по ICQ или E-mail. Их можно узать в Контактах.

ВНИМАНИЕ: Коммерческая публикация данной статьи запрещена без согласования с автором, т.е. со мной. Не коммерческая публикация статьи должна обязательно быть с указанием источника.





Комментарии

Функция доступна только зарегистрированным пользователям.
Войдите под своей учетной записью или зарегистрируйтесь.

Powered by AkoComment 2.0!

 
2001-2007 Jey_k & Albinos_X
Мой ip проверка
ALLDAY.RU - портал обо всем интересном в дизайне