Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с Word и Excel, через WordApplication и ExcelApplication 
:(
    Опции темы
Poseidon
Дата 3.5.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



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

Немного теории:
Работа с компанентой WordApplication, производится как с любым объектом делфи. 

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

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

Среди множества свойств стоит обратить внимание на свойство 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 - в видимом. Сделать видимым или невидимым документ, можно в любом месте программы с помощью свойства WordApplication - Visible:
Код

WordApplication1.Visible:=True;  // сделать видимым, false соответствеено невидимым


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

WordApplication1.Documents.Add(EmptyParam,EmptyParam);


для того, чтоб сделать приложение работающее под любую версию Word-а, необходимо учитывать такие отличия, и соответственно в программе проверять версию установленного Word-а. Это можно сделать с помощью свойства Version и будет выглядить приблизительно так:
Код
...
uses 
    ... , Word97, WordXP
...
if (StrToInt(Copy(WordApplication1.Version,1,pos('.',WordApplication1.Version)-1)))<9 then
   WordApplication1.Documents.Add(EmptyParam,EmptyParam)
   else
   WordApplication1.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
...

чучуть поясню... свойство Version  имеет строковый тип, и к примеру для Word97 вернёт "8.0", 2000 - "9.0", 2002 - "10.0"...

Также важным свойством WordApplication является свойство Selection - указывающий на позицию курсора или выделенный фрагмент текста в активном документе. Для вставки текста имеются методы InsertAfter и InsertBefore. Первый вставляет текст после объекта Selection, второй - перед ним.
Код
...
WordApplication1.Selection.InsertAfter('ОТЧЁТ ' +Edit1.Text+#13);
...

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

WordFont1.ConnectTo(WordApplication1.Selection.Font);
WordParagraphFormat1.ConnectTo(WordApplication1.Selection.ParagraphFormat);

Примеры работы с этими объектами размещу ниже...

Для вставки текста имеется ещё один очень интересный метод TypeText. Но его работа немного отличается от ранее описанного. И зависит от свейства ReplaceSelection, принадлежащее свойству Options. Если RepleceSelection:= true, то выделение заменяется на указанный текст, если false, то новый текст вставляется перед выделением:
Код
...
WordApplication1.Options.RepleceSelection:=true;
WordApplication1.Selection.TypeText('ОТЧЁТ');
...

в результате выполнения кода выделенный текст заменится на слово "ОТЧЁТ".

для вставки из буффера обмена у Selection есть метод Paste, который так же зависит от ReplaceSelection.

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

Как и в сервере Excel здесь мы можем встретить объекты Range - соответствует какому-то непрерывному участку текста.
Код
...
var Rang,Start,End:OleVariant;
...
Start:=1; Endr:=15;
Rang:=WordDocument1.Range(Start,Endr);
...

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

Нашёл в одной книжке описание ещё одного свойства сервера Word - это Dialogs. Сам его ещё не опробовал, но всё же опишу.
Итак, Dialogs - массив (собрание) объектов Dialog, которые соответствуют встроенным диалогам Word. Доступ к ним осуществляется так:
Код
...
WordApplication1.Dialogs.Item(wordDialog);
...

константа wordDialog может принимать следующие ванианты:
wdDialogEditFind                -   найти фрагмент текста
wdDialogEditPasteSpecial  - Специальная вставка из буфера обмена
wdDialogEditReplace          - Заменить фрагмент текста
wdDialogFileFind                - Найти файл
wdDialogFileNew                - Новый файл
wdDialogFileOpen               - открыть файл
wdDialogFilePageSetup      - Параметры страницы
wdDialogFilePrint                - Печать файла
wdDialogFilePrintSetup       - Установить принтер
wdDialogFileSaveAs            - Сохранить файл как
wdDialogFileSummaryInfo   - Свойства документа (Статистика)
wdDialogFormatFont           - Шрифт
wdDialogFormatParagraph  - Абзац
wdDialogInsertDatabase     - Вставить БД
wdDialogInsertFile               - Вставить файл
wdDialogInsertPageNumbers - Вставить номера страниц

у Dialog есть метод Show, открывающий пользователю диалог. В метод передается не обязательный аргумент TimeOut - время в миллисекундах, после которого диалог автоматически закроется, если передать значение по умолчанию (EmptyParam), то диалог будет закрываться только пользователем. Причём перед показом диалога желательно, чтоб сервер был видимым(если ещё невидимый), иначе он станет видимым автоматически, но появится без главного меню и инструментальных панелёй. Что не есть хорошо. Кроме того метод Show возвращает целое число, определяющее какой кнопкой закрыт диалог. Но здесь есть подводный камень, можно сказать один из недостатков этого метода, - Возращаемые числа для разных диалогов не одинаковы. К примеру если один возвращает:
-2  : Кнопка закрыть
-1 : Кнопка Ок
0  : Кнопка Отмена или Esc
>0 : Командные кнопки
, то диалог открытия файла:
0 : Кнопки закрыть, отмена,  Esc
-1 : Кнопка Открыть

Автор: Albinos_x Источник: Vingrad


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.