Голосование

Собираетесь ли Вы поменять работу в ближайшее время?

Не знаю
Еще поработаю
Никогда не поменяю
Собираюсь (полгода)
Собираюсь (год)
Уже поменял



Посмотреть результаты
Другие опросы ...

 

Лента RSS, новости сайта Новости сайта
Лента RSS, новости форума Новости форума
  Bookmark and Share

Архив исходников

   
  Базы данных
  Графика & Мультимедиа
  Сети & Интернет
  Система
  Разное
   

Кнопки, Ссылки и Баннеры ...

 


Automatic translation


English German French Italian Spanish
Portuguese Greece Japan Chinese Korean


Ссылки и Баннеры


скрыть

 

Delphi Sources

Delphi Sources

СТАТЬИ

 

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

 

Страницы | 1 | 2 | 3 |


Введение


   О чем эта статья?
   Статья эта – живой пример и краткий учебник по автоматизации OpenOffice.Calc и OpenOffice.Writer. Дело в том, что в большинстве организаций используются различные специфические программы. Однако, для форматирования результатов их работы применяются продукты компании Microsoft (в частности, Excel и Word). То есть результаты работы специфической программы передаются в программы из пакета Microsoft Office, а затем их можно, например, распечатать и включить в отчет. Ситуация знакомая многим. Причем средства взаимодействия с программами фирмы Microsoft хорошо изучены и давно используются. Однако не стоит забывать, что эти программы являются платными, и не каждая организация способна выложить круглую сумму за оснащение всех своих ПК лицензионными версиями этих программ. Поэтому в организации, где я работаю и была поставлена задача сделать все аналогично, но под бесплатный продукт OpenOffice. Собственно, это было короткое введение, теперь перейдем к основной части.

   Основное требование заключалось в том, чтобы написано все было на Delphi. Сразу появилась проблема: материалов по OpenOffice под Delphi в сети почти нет. Основной документ, которым стоит обзавестись начинающему разработчику – безусловно DevelopersGuide по OpenOffice. В этом документе можно найти ответы почти на все возникающие в процессе разработки вопросы. Конечно, можно попросить помощи и у других разработчиков, например, здесь: http://www.oooforum.org/forum/.

   Определившись с тем, откуда лучше черпать информацию, разберемся, что именно мы хотим получить от готового решения. В большинстве случаев для успешной совместной работы офисных программ и программ конкретного предприятия необходимо наличие следующих действий:
   1. Создать новый файл (как вариант, открыть существующий файл).
   2. Сохранить изменения в файле.
   3. Вывести файл на печать.
   4. Закрыть документ.
   5. Внести в открытый документ какие-либо изменения.
   6. Отформатировать документ (имеется в виду изменение цвета фона, размера шрифта, стили шрифта и т.д.).

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

Часть первая. Начало

   Начнем, как это водится, с основ. В основе OpenOffice лежит компонентная модель UNO (Universal Network Objects). Которая обеспечивает возможности для работы OpenOffice на базе различных платформ. Сразу оговорюсь, что мы разрабатываем приложение под ОС Windows, то есть с помощью технологии OLE, которая не поддерживается напрямую OpenOffice. Связано это с тем, что OLE – все-таки Windows технология, а, как было сказано выше, OpenOffice – продукт кроссплатформенный.

   Для взаимодействия между OLE и языком OpenOffice используется технология Automation Bridge. Модель UNO, в свою очередь, предоставляет возможность работы со своими компонентами через Service Manager.

   Данная информация дана просто в качестве вводной, так как эти вопросы уже многократно обсуждались и, как мне кажется, не нуждаются в дополнительном освещении с моей стороны. Подробнее почитать об этом можно например тут: developers.sun.com; или тут: www.openoffice.org.

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

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 и перейдем к работе непосредственно с документами.

 

Страницы | 1 | 2 | 3 |
 

Дата: 14.05.2007, Автор: Васильков Ю. В..
Оригинал статьи: http://www.i-rs.ru/article/articleview/472/1/51/






Назад

   

 







































































































































































 

© 2004-2017 "DS"

Отправить письмо / Реклама


ВКонтакте   Facebook   Twitter