О компании  |  Услуги  |  Партнёрам  |  OpenOffice.org  |  OpenOffice-Enterprise  |  Купить  |  Скачать  |  Форум 
 
Справка
Новости
События
Наши проекты
Контакты
Глоссарий











Rambler's Top100

Главная OpenOffice.org Статьи и переводы Конкурс на лучшую статью Конкурсные работы (53) Офисные Технологии (12)

Первые шаги в автоматизации OpenOffice.Calc и OpenOffice.Writer под Delphi




Часть вторая. Основы


2.1 Подключение к серверу автоматизации


Для начала работы с OpenOffice нам нужно подключиться к серверу автоматизации. Как это сделать, показано в листинге 1. Отмечу, что переменные OO и Document объявлены как Variant.
Листинг 1

function TOpenOffice.Connect: boolean;
begin
   if VarIsEmpty(OO) then
      OO := CreateOleObject('com.sun.star.ServiceManager');
   Result := not (VarIsEmpty(OO) or VarIsNull(OO));
end;

Как мне кажется, комментарии здесь излишни, отмечу только, что 'com.sun.star.ServiceManager'и есть программный идентификатор Service Manager'а.

2.2 Отключение от сервера автоматизации


Рассмотрим теперь функцию Disconnect. Она еще проще (листинг 2).
Листинг 2
procedure TOpenOffice.Disconnect;
begin
   OO := Unassigned;
end;

Комментарии излишни.

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

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


Для создания документа используем функцию CreateDocument. Она приведена на листинге 3.
Листинг 3
function TOpenOffice.CreateDocument: boolean;
var
   Desktop: Variant;
begin
   Desktop := OO.createInstance('com.sun.star.frame.Desktop');
   Document := Desktop.LoadComponentFromURL(
                  'private:factory/swriter', '_blank', 0,
                  VarArrayCreate([0, -1], varVariant));
   Result := not (VarIsEmpty(Document) or VarIsNull(Document));
end;

Рассмотрим эту функцию подробнее. Переменная Desktop – ни что иное, как экземпляр OpenOffice. Получив этот экземпляр, мы можем создавать документ. Для этого используется метод LoadComponentFromURL. Первым параметр – имя файла в URL-формате. Здесь можно указать существующий файл (тогда мы откроем уже существующий файл). Хотя файл, заданный нашим параметром тоже существует, только это шаблон пустого файла. Сразу отметим, что это файл Writer'а. Для открытия файла, например, Calc, нам надо первым параметром передать: 'private:factory/scalc'. Отличия на этом в открытии файлов разных приложений заканчиваются. Второй параметр означает, что документ создается в новом окне. Третий параметр – флаг вызова. Далее – опции открытия. Рассмотрим их позже.

2.4 Открытие документа


Теперь функция открытия документа. Сама функция приведена на листинге 4.
Листинг 4
function TOpenOffice.OpenDocument(const FileName:string): boolean;
var
   Desktop: Variant;
   VariantArray: Variant;
begin
   Desktop := OO.CreateInstance('com.sun.star.frame.Desktop');
   VariantArray := VarArrayCreate([0, 0], varVariant);
   VariantArray[0] := MakePropertyValue('FilterName', 'MS Word 97');
   Document := Desktop.LoadComponentFromURL(FileName, '_blank', 0,VariantArray);
   Result := not (VarIsEmpty(Document) or VarIsNull(Document));
end;

Отличия этой функции от предыдущей только в опциях открытия. Для этого мы их помещаем в массив VariantArray. В частности, главное – что мы ставим фильтр на открытие: MS Word 97. То есть мы работаем с файлами MS Office. Отмечу, что для Calc'a мы бы написали MS Excel 97.

Небольшое отступление. Возникает вопрос: почему мы открываем файлы MS Office? Ответ прост. Пользователь не зависит от ПО, установленного у него на компьютере, ведь легко представить себе ситуацию, когда на одном компьютере установлен OpenOffice, а на другом MS Office. Поэтому работа с файлами одного формата решит проблему взаимодействия пользователей, у которых стоят различные «офисы». Более того, конечный пользователь даже не заметит разницы: оболочки очень похожи, функции выполняются одинаковые. Как мне кажется, это является важным условием при переходе с MS Office на OpenOffice.

В этой функции используется функция MakePropertyValue. Листинг 5.
Листинг 5
function TOpenOffice.MakePropertyValue(PropertyName, PropertyValue:string):variant;
var
	Structure: variant;
begin
    Structure := OO.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
    Structure.Name := PropertyName;
    Structure.Value := PropertyValue;
    Result := Structure;
end;

Функция эта вспомогательная, она просто ставить заданное значение в соответствие заданному свойству. И возвращает пару свойство-значение. Выделили мы ее потому, что она будет необходима в ряде других мест.

2.5 Процедуры «Сохранить документ» и «Сохранить как»


Теперь рассмотрим сохранение документа в формате MS Word (или Excel).
Процедура сохранения показана на листинге 6.
Листинг 6

procedure TOpenOffice.SaveDocument(const FileName:String);
var
   Desktop: Variant;
   VariantArray: Variant;
begin
   Desktop := OO.createInstance('com.sun.star.frame.Desktop');
   VariantArray := VarArrayCreate([0, 0], varVariant);
   VariantArray[0] := MakePropertyValue('FilterName', 'MS Word 97');
   Document.StoreToURL(FileName, VariantArray);
end;

Как мы видим, разница только в функции StoreToUrl. Опять же отмечу, что для документа Calc мы могли бы написать MS Excel 97.

Рассмотрим еще одну процедуру SaveAs. Эта процедура просто сохраняет документ под новым именем (листинг 7).
Листинг 7
procedure TOpenOffice.SaveAs(FileName: String);
const
   Bounds:array[1..2] of integer = (0,1);
var
   VariantArray: Variant;
begin
   VariantArray := VarArrayCreate([0,1], varVariant);
   VariantArray[0] :=  MakePropertyValue('FilterName', 'MS Excel 97');
   VariantArray[1] :=  MakePropertyValue('Overwrite', True);
   Document.storeToURL('file:///'+FileName, VariantArray);
end;

В данном случае мы сохраняем текущий документ под именем FileName, если такой документ уже существует, то мы его перезаписываем (свойство Overwrite = True).

2.6 Закрытие документа


Следующая процедура – закрытие текущего документа. Она тоже проста и не требует никаких комментариев (листинг 8).
Листинг 8

procedure TOpenOffice.CloseDocument();
begin

 Document.Close(True);
 Document:=Unassigned;
end;

2.7 Печать документа


Последняя процедура в этом разделе – процедура вывода на печать текущего документа (листинг 9).
Листинг 9
procedure TOpenOffice.Print(iNumCopies:integer);
const Bounds:array[1..2] of integer = (0,0);
var

    VariantArray: Variant;

begin
    if ( iNumCopies < 1 ) or ( iNumCopies > 512 ) then
       iNumCopies := 1;
    VariantArray := VarArrayCreate(Bounds, varVariant);
    VariantArray[0]:= MakePropertyValue('CopyCount',iNumCopies);
    Document.print(VariantArray);
end;

В данном случае мы передаем на печать необходимое количество копий (iNumCopies). Для меня именно это было критично, хотя есть и другие параметры печати, которые можно задавать точно таким же образом. Например, свойство Pages:string - определяет страницы для печати, формат ввода такой: ' 1-9,11,15-20'; или свойство FileName:string – определяет файл, в который производится печать.

На этом мы закончим рассмотрение основных функций, необходимых для работы с OpenOffice и перейдем к работе непосредственно с документами.

Об авторе

Подробнее: Васильков Юрий Владимирович
Дата создания: 01.05.2007

Обсудить

на форуме: community.i-rs.ru

Присоединенные файлы

_OOo_Delphi.odt
_OOo_Delphi.pdf

<< Предыдущая страница | 1 | 2 | 3 | < 4 > | 5 | 6 | 7 | Следующая страница >>

| Версия для печати |
Copyright © 2002-2007 Infra Resource