Лекция 5. Взаимодействие с OpenOffice.ppt
- Количество слайдов: 16
ФГБОУ ВПО Тул. ГУ Кафедра «Автоматизированные станочные системы» Взаимодействие с Open. Office. org через COM к. т. н. , доц. Анцев А. В.
История ООо Apache Open. Office (Open. Office. org, OO. o, OOo) — свободный пакет офисных приложений. ООо основан на коде Star. Office, который был приобретён, а затем выпущен с открытым исходным кодом фирмой Sun Microsystems. После покупки последней права на OOo перешли к компании Oracle. 28 сентября 2010 года, из-за жёсткого стиля руководства «сверху» , ведущие разработчики Open. Office. org объявили о создании новой некоммерческой организации The Document Foundation с целью продолжения развития офисного пакета в виде проекта Libre. Office, независимого от компании Oracle. 1 июня 2011 года компания Oracle официально объявила о передаче всех прав на Open. Office. org Apache Foundation. После окончательного перехода проекта в руки фонда, лицензия на код Open. Office. org будет изменена на Apache License 2. 0. По этому поводу Фонд свободного ПО выступил с заявлением, в котором выразил огорчение по поводу подобного шага, счёл переход на не копилефт лицензию ошибочным шагом и рекомендовал использовать Libre. Office. 2
Компонентая модель Open. Office. org Работа Open. Office. org базируется на компонентной модели, именуемой Универсальные Сетевые Объекты (Universal Network Objects, UNO). UNO предоставляет механизм для кроссплафторменного и языконезависимого программирования. UNO изначально не создавался с поддержкой автоматизации и COM, а был ориентирован на работу со скриптовыми языками. Начиная с версии Star. Office 5. 2, автоматизация OLE является составной частью пакета. Однако, прямой доступ к этим компонентам (UNO) из Delphi получить не удастся. Для этого используется механизм "моста автоматизации" (Automation Bridge), который объединяет интерфейс автоматизации OLE с языковыми связками Star. Office API. UNO предоставляет единственный интерфейс для работы со своими компонентами -- Сервис Менеджер (Service Manager). Сервис Менеджер по сути является фабрикой классов, следовательно возвращает интерфейс IClass. Factory. С точки зрения концепции модели UNO иного пути для создания объектов автоматизации Open. Office. org как через Сервис Менеджер нету. 3
Сервис Менеджер Как уже отмечалось, Сервис Менеджер (СМ) -- это стартовая точка для всех клиентов автоматизации. Раз СМ является COMкомпонентом, то он имеет CLSID и програмный идентификатор, а именно: com. sun. star. Service. Manager СМ, так же как и объекты, которые он создает, и объекты, предоставляемые им же косвенно через результаты возврата функций, является типичным объектом автоматизации. Имеется возможность удаленного доступа через механизм DCOM. 4
Сервис Менеджер Исполняемый код СМ содержится в файле soffice. exe. Этот исполняемый файл держит все СОМ подключения и открытые документы, будь-то текстовые либо электронные таблицы. Даже в случае повторного запуска, запущенный процесс берет на себя всю заботу об открытии документов, предоставлении интерфейсов OLE автоматизации, а копию закрывает. Поэтому в памяти может находится только один такой процесс. А это значит, что для связки OOо-Delphi нет понятия подключения к существующему СОМ объекту, то есть Get. Active. Object имеет тот результат что и вызов Create. Ole. Object. Поэтому, дабы избежать ненужной проверки на существование запущенного процесса, будем использовать второй вариант, что неизбежно приведет нас к нужному результату. 5
Сервис Менеджер базируется на Сервис Менеджере UNO и ничем не отличается от обычных компонентов UNO. За конвертацию Сервис Менеджера в COM-сервер отвечает сервис com. sun. star. bridge. Ole. Bridge. Supplier 2 Результирующий объект автоматизации содержит в себе объект UNO и транслирует вызовы IDispatch. Invoke в необходимые функции интерфейсов UNO. Возвращаемые после таких вызовов объекты, тоже автоматически конвертируются в правильные СОМобъекты. 6
Схема взаимодействия с ООо 7
type Класс для работы с ООо TOpen. Office = class function Connect: boolean; procedure Disconnect; function Create. Document: boolean; function Open. Document(const a. File. Url: string): boolean; procedure Save. Document(const a. File. Url: string); procedure Insert. Text(const a. Text: String); private Star. Office: Variant; Document: Variant; function Make. Property. Value(Prop. Name, Prop. Value: string): variant; end; 8
Подключение к ООо function TOpen. Office. Connect: boolean; begin if Var. Is. Empty(Star. Office) then Star. Office : = Create. Ole. Object('com. sun. star. Service. Manager'); Result : = not (Var. Is. Empty(Star. Office) or Var. Is. Null(Star. Office)); end; Метод Connect создает подключение к серверу автоматизации. Как упоминалось выше, в нашем случае понятия "подключиться к существующему" и "создать подключение" не имеют принципиальной разницы. Поэтому используется функция Create. Ole. Object 9
Отключение от ООо procedure TOpen. Office. Disconnect; begin Star. Office : = Unassigned; end; 10
Создание текстового документа function TOpen. Office. Create. Document: boolean; var Star. Desktop: Variant; begin Star. Desktop : = Star. Office. create. Instance('com. sun. star. frame. Desktop'); Document : = Star. Desktop. Load. Component. From. URL( 'private: factory/swriter', '_blank', 0, Var. Array. Create([0, -1], var. Variant)); Result : = not (Var. Is. Empty(Document) or Var. Is. Null(Document)); end; Менеджер, который доступен через переменную Star. Office, создает и возвращает экземпляр Desk. Top. 11
Метод Load. Component. From. URL Параметры: 1. Имя файла, в виде URL. На самом деле строка 'private: factory/swriter' действительно указывает на существующий файл. Это файл шаблона, по которому создается пустой текстовый документ. 2. ('_blank') -- указывает на то, что документ должен открыться в новом окне. 3. Флаги вызова, пока что всегда равны нулю. 4. Опции открытия документов. На самом деле, это массив пар название опции - значение опции. В данном случае, дополнительных опций мы не используем, поэтому передаем пустой массив. Для вызова метода Load. Component. From. URL с дополнительными опциями заранее создается массив необходимого размера. 12
Вспомогательная функция создания свойств для ООо За создание пар опция-значение отвечает сам Open. Office. org. Поэтому этот участок работы оформлен в отдельной функции. function TOpen. Office. Make. Property. Value(Prop. Name, Prop. Value: string): variant; var Struct: variant; begin Struct : = Star. Office. Bridge_Get. Struct('com. sun. star. beans. Property. Value'); Struct. Name : = Prop. Name; Struct. Value : = Prop. Value; Result : = Struct; end; 13
Открытие документа function TOpen. Office. Open. Document(const a. File. Url: string): boolean; var Star. Desktop: Variant; Variant. Arr: variant; begin Star. Desktop : = Star. Office. Create. Instance('com. sun. star. frame. Desktop'); Variant. Arr : = Var. Array. Create([0, 0], var. Variant); Variant. Arr[0] : = Make. Property. Value('Filter. Name', 'HTML (Star. Writer)'); Document : = Star. Desktop. Load. Component. From. URL( a. File. Url, '_blank', 0, Variant. Arr); Result : = not (Var. Is. Empty(Document) or Var. Is. Null(Document)); end; 14
Вставка текста procedure TOpen. Office. Insert. Text(const a. Text: String); var o. Cursor: Variant; o. Text: Variant; begin o. Text : = Document. Get. Text; o. Cursor : = o. Text. Create. Text. Cursor; o. Cursor. Set. Property. Value('Char. Color', 255); o. Cursor. Set. Property. Value('Char. Shadowed', True); o. Text. Insert. String(o. Cursor, a. Text, false); o. Text. Insert. Control. Character(o. Cursor, 0, false); end; 15
Сохранение документа procedure TOpen. Office. Save. Document(const a. File. Url: string); var Star. Desktop: Variant; Variant. Arr: variant; begin Star. Desktop : = Star. Office. create. Instance('com. sun. star. frame. Desktop'); Variant. Arr : = Var. Array. Create([0, 0], var. Variant); Variant. Arr[0] : = Make. Property. Value('Filter. Name', 'MS Word 97'); Document. Store. To. URL(a. File. Url, Variant. Arr); end; 16
Лекция 5. Взаимодействие с OpenOffice.ppt