Com sun star frame desktop

Доброе время суток мастера.
Я заинтересовался автоматизацией выгрузки данных из программы, написанной на Delphi в OpenOffice.

Вопрос 1.
С созданием с пустой таблицы и открытием существующей таблицы все понятно, у меня все это получилось, а вот создание нового файла на основе шаблона MS Excel я не знаю как.
Создание пустой таблицы:
OO := CreateOleObject("com.sun.star.ServiceManager");
Desktop := OO.createInstance("com.sun.star.frame.Desktop");
Document := Desktop.LoadComponentFromURL("private:factory/scalc", "_blank", 0, VarArrayCreate([0, -1], varVariant));
Открытие существующего файла:
OO := CreateOleObject("com.sun.star.ServiceManager");
Desktop := OO.createInstance("com.sun.star.frame.Desktop");
Document := Desktop.LoadComponentFromURL("file:///d:prob.xls", "_blank", 0, VarArrayCreate([0, -1], varVariant));
Подскажите если кто знает как создать новый файл на основе шаблона MS Excel (без сохранения файла на диске).

Вопрос 2.
Подскажите как можно скопировать в буфер обмена группу ячеек, а затем вставить из буфера эти ячейки в другое место на этом листе.


TStas © ( 2008-10-02 21:45 ) [1]

Также, как и любые другие действия с сервером автоматизации: пишешь экселевский макрос мышкой, а потом смотришь, что именно написалось. Единственно что, иногда некотороые вещи, например стили рамок в экселе, макрос пишется, а из Дельфей не получается, т. к. не поддерживается. Константы экселевские и вордовские узнаются очень просто: вставляешь в макрос MsgBox(Гордое_имя_константы). Вылазит окошко с еёным значением.


wipr ( 2008-10-02 21:59 ) [2]

Что касается создания файла на основе шаблона, то предложенный вариант не поможет.
а вот по поводу капирования в буфер обмена и затем вставки я пробовал, только как это перевести в Delphi не понятно
пример
sub Macro1
rem ———————————————————————-
rem define variables
dim document as object
dim dispatcher as object
rem ———————————————————————-
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

dispatcher.executeDispatch(document, ".uno:ClipboardFormatItems", "", 0, args4())


blackman © ( 2008-10-02 22:26 ) [3]

Первые шаги в автоматизации OpenOffice.Calc и OpenOffice.Writer под Delphi
http://articles.org.ru/cn/showdetail.php?c >


wipr ( 2008-10-02 22:31 ) [4]

с этой статьей я знаком, в ней нет ответов на мой вопрос


blackman © ( 2008-10-03 12:06 ) [5]

Открой шаблон и сохрани с новым именем хотя бы в temp.
Зачем вообще создавать, если ты его не собираешься сохранять?


wipr ( 2008-10-03 20:45 ) [6]

Если я не собираюсь его сохранять, то зачем его сохранять в TEMP, к тому же бывает необходимо сделать на основе одного отчета несколько, например с разными периодами и проанализировать их, если сохранять в темпе, то второй отчет не создашь из за того, что открыт будет первый, если на каждый отчет давать уникальное имя отчета, то будет много мусора собираться, идеально если как в MS Excel будет создаваться новый файл каждый раз без сохранения на диске.


YurikGL © ( 2008-10-04 09:07 ) [7]

Создавай XML-документ и открывай его тем, что установлено на компьютере. Будет работать и с опенофисом и с МСофисом.


wipr ( 2008-10-05 09:20 ) [8]

Это подойдет если отчет имеет один набор данных, если это отношение один ко многим, с разным форматированием, шахматка, или этикетки, которые множатся как в сторону, так и в низ, то подготовка xml не упростит задачу, а скорее усложнит.
Если с созданием на основе шаблона еще можно выкрутится, например шаблоны разместить в сети с доступом только на чтение, то их случайно пользователи не смогет испортить. Но мне важнее всего узнать ка можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место. Так же хотелось знать как можно вставить новую строку между двумя существующими.


YurikGL © ( 2008-10-05 14:37 ) [9]


> Если с созданием на основе шаблона еще можно выкрутится,
> например шаблоны разместить в сети с доступом только на
> чтение, то их случайно пользователи не смогет испортить

Именно с шаблоном и надо делать. Только подгружать его лучше из базы (если, конечно, с базой данных работаешь).


blackman © ( 2008-10-05 19:27 ) [10]

wipr (05.10.08 09:20) [8]
Как пользователь испортит, если ты его переименовал и записал в темп?
Он уже не имеет доступа к первоначальному шаблону.


wipr ( 2008-10-06 19:45 ) [11]

Для меня важнее всего узнать как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место. Так же хотелось знать как можно вставить новую строку между двумя существующими.
Переименовывать и сохранять в temp шаблон меня не устраивает по нескольким причинам.


Наиль © ( 2008-10-08 19:39 ) [12]

Возможно стоит воспользовать AutomateIt, он позволяет писать единый код для обоих офисов. С учётом наличия исходного кода, возможно найдутся ответы и на твои вопросы.
http://sourceforge.net/projects/automateit/


wipr ( 2008-10-09 20:30 ) [13]

AutomateIt открывает Open Office Calk, но те операции котрые я выполняю с Excel, он не поддерживает, выдается ошибка. Мне необходимо узнать
1) Как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место?
2) Как можно вставить новую строку между двумя существующими?
3) Как создать новый файл на основе шаблона MS Excel?


Наиль © ( 2008-10-11 13:40 ) [14]

Т.к. я не знаю точные вопросы на эти ответы, то постораюсь указать "рыбные места"
1. Самый ценый источник — это делфи- (вернее паскаль-)обёртка вокруг автоматизации ОpОfОrg http://uno-pas-bridge.sourceforge.net/pre-release.php
2. Самый понятный, и думаю уже изученый вами: http://www.delphimaster.ru/articles/openoffice/index.html
3. Форум разработчиков ОколоОпенОфис программ: http://www.oooforum.org/forum/viewforum.phtml?f=11
Особое внимание стоит обратить на файл OO_Names.pas из первой ссылки.
В нём перечислены все комманды OpenOffice
К примеру к вашему вопросу близки такие комманды:
"com.sun.star.sheet.XCellRangeMovement"
"com.sun.star.sheet.CellInsertMode"


Наиль © ( 2008-10-11 13:47 ) [15]

И вот ещё.
Место тусовки авторов обёртки: http://www.freepascal.ru/forum/viewtopic.php?f=6&t=2585


Наиль © ( 2008-10-11 19:44 ) [16]

Ещё одна ссылка.
Форум на которум успели обсудить практически все проблемы скрещивания OOffica и Delphi
http://www.sql.ru/forum/actualthread.aspx?b >


wipr ( 2008-10-13 21:26 ) [17]

Большое спасибо сссылки помогли решить 2 из трех проблем, дам ответ, может кому будет интересно:
1) Как можно скопировать область ечеек в буфер обмена, а затем из него вставить в другое место?
ответ.
procedure TfrmMane.Button9Click(Sender: TObject);
var
OO, Document, Desktop, OODispatcher: Variant;
ooParams, ooFrame: Variant;
begin
OO := CreateOleObject("com.sun.star.ServiceManager");
Desktop := OO.CreateInstance("com.sun.star.frame.Desktop");
Document := Desktop.LoadComponentFromURL("file:///d:prob.xls", "_blank", 0, VarArrayCreate([0, -1], varVariant));
OODispatcher := OO.createInstance("com.sun.star.frame.DispatchHelper");
ooFrame:=Document.getCurrentController.getFrame;

ooParams:= VarArrayCreate([0, 0], varVariant);
ooParams[0]:= OO.Bridge_GetStruct("com.sun.star.beans.PropertyValue");

ooParams[0].name := "ToPoint";
ooParams[0].value := "$A$1:$B$3";
ooDispatcher.executeDispatch(ooFrame, ".uno:GoToCell", "", 0, ooParams);
ooDispatcher.executeDispatch(ooFrame, ".uno:Copy", "", 0, ooParams);

ooParams[0].name := "ToPoint";
ooParams[0].value := "$A$5";
ooDispatcher.executeDispatch(ooFrame, ".uno:GoToCell", "", 0, ooParams);
ooDispatcher.executeDispatch(ooFrame, ".uno:Paste", "", 0, ooParams);
end;

2) Как можно вставить новую строку между двумя существующими?
ответ.
procedure TfrmMane.Button17Click(Sender: TObject);
var
OO, Document, Desktop, OODispatcher: Variant;
ooParams, ooFrame: Variant;
begin
OO := CreateOleObject("com.sun.star.ServiceManager");
Desktop := OO.CreateInstance("com.sun.star.frame.Desktop");
Document := Desktop.LoadComponentFromURL("file:///d:prob.xls", "_blank", 0, VarArrayCreate([0, -1], varVariant));
OODispatcher := OO.createInstance("com.sun.star.frame.DispatchHelper");
ooFrame:=Document.getCurrentController.getFrame;
ooParams:= VarArrayCreate([0, 0], varVariant);
ooParams[0]:= OO.Bridge_GetStruct("com.sun.star.beans.PropertyValue");

ooParams[0].name := "ToPoint";
ooParams[0].value := "$A$2";
ooDispatcher.executeDispatch(ooFrame, ".uno:GoToCell", "", 0, ooParams);
//после установки курсора вставляем строку перед курсором
ooDispatcher.executeDispatch(ooFrame, ".uno:InsertRows", "", 0, ooParams);
end;

3) Как создать новый файл на основе шаблона MS Excel?
на этот вопрос пока ответа не нашел


имя ( 2009-03-24 14:05 ) [18]


имя ( 2009-03-24 14:07 ) [19]

Есть ситуации, когда нет возможности установить Excel на стороне клиента, а нужно загружать в базу данные *.xls файлов. Спасением является бесплатный OpenOffice (либо LibreOffice, т.к. работа через COM с ними абсолютно одинакова).

Ниже привожу процедуры загрузки и выгрузки.

Как видно из функции ЗагрузитьТЗизФайла — читается сразу вся область данных файла, поэтому с быстродействием все отлично. На выходе имеем готовую таблицу значений. В данном случае каждой колонке определен тип Строка(50), но можно этого и не делать, просто это нужно, если собираетесь, например, помещать ее во временную таблицу.

Процедура ВыгрузитьТЗвФайл сохраняет любую таблицу значений в файл MS Excel. В текущем примере откроется OpenOffice/LibreOffice Calc c данными переданной таблицы значений. Если раскомментировать строки:

при этом добавив Параметр ПутьКФайлу , то данные запишутся в файл без открытия Calc`a. Если обратить внимание на сохранение, то сразу бросается двойной вызов Document.storeToURL — это необходимо для корректного сохранения в формате MS Excel.

Функция ПривестиФайлКУРЛ просто приводит путь к виду, необходимому OpenOffice/LibreOffice.

Вот и все. Как вы смогли убедиться — работа с Calc`ом не сложнее таковой с Microsoft Excel.

Введение

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

Основное требование заключалось в том, чтобы написано все было на Delphi. Сразу появилась проблема: материалов по OpenOffice под Delphi в сети почти нет. Основной документ, которым стоит обзавестись начинающему разработчику — безусловно DevelopersGuide по OpenOffice. В этом документе можно найти ответы почти на все возникающие в процессе разработки вопросы.

Определившись с тем, откуда лучше черпать информацию, разберемся, что именно мы хотим получить от готового решения. В большинстве случаев для успешной совместной работы офисных программ и программ конкретного предприятия необходимо наличие следующих действий:
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.

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

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

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

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

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

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

Рассмотрим теперь функцию Disconnect. Она еще проще (листинг 2).

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

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

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

Для создания документа используем функцию CreateDocument. Она приведена на листинге 3.

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

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

Теперь функция открытия документа. Сама функция приведена на листинге 4.

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

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

В этой функции используется функция MakePropertyValue. Листинг 5.

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

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

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

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

Рассмотрим еще одну процедуру SaveAs. Эта процедура просто сохраняет документ под новым именем (листинг 7).

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

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

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

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

Последняя процедура в этом разделе — процедура вывода на печать текущего документа (листинг 9).

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

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

3.1 Вставка текста в начало документа

Основными действиями, которые нас интересуют в работе с Writer’ом является возможность вставлять текст, например в начало документа и по метке, плюс возможность задавать форматирование текста. Поскольку работа с метками несколько более сложная, разберемся вначале с первым вариантом. Функция вставки текста приведена в листинге 10.

Рассмотрим эту процедуру подробнее. Прежде чем начать работу с текстом, нам необходимо получить указатель на текст, как на объект документа. Для чего мы используем TextPointer := Document.GetText . Таким образом, схема взаимодействия будет следующей: ServiceManager -> Desktop -> Document -> TextPointer . После этого нам надо создать курсор, что делается методом CreateTextCursor . Только после этого мы уже можем непосредственно вставить строку в начало документа: TextPointer.InsertString(CursorPointer, Text, false) . В качестве параметров для этого метода мы передаем созданный курсор, текст для вставки, а также параметр absorb: boolean. Если этот параметр равен False, то текст будет вставляться последовательно, в этом случае TextPointer будет указывать на весть текст, включая последнюю вставленную строку; если же True — тогда только на последнюю вставленную строку, причем, строка, на которую он указывал раньше будет удалена.

Метод InsertControlCharacter вставляет символ завершения строки. Второй аргумент ("0") — константа, которая обозначает этот символ ( com::sun::star::text::ControlCharacter::PARAGRAPH_BREAK ).

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

Можно поменять цвет шрифта:

В этом случае в качестве второго параметра передается цвет в формате RGB.

Можно сделать текст подчеркнутым, курсивным и жирным. Это будет выглядеть так:

CursorPointer.setPropertyValue(‘CharPosture’,fsItalic);
CursorPointer.setPropertyValue(‘CharWeight’,fsBold);
CursorPointer.setPropertyValue(‘CharUnderline’,fsUnderline);

В принципе, можно и самому задать степень "жирности" и другие параметры. Ведь fsBold и т.д. есть ни что иное, как константы. Поэтому можно, например ввести вместо fsBold константу 200, текст будет жирными. Советую поэкспериментировать с этим.

Отмечу, что вновь вставленная строка будет обладать установленными свойствами, если их определить до вставки.

И еще пара возможностей для работы с курсором. Можно перейти в начало текста:

CursorPointer.gotoEnd(False).
CursorPointer.goLeft(short Count, boolean Expand) — передвигаем курсор влево на Count .
Аналогично goRight(short Count, boolean Expand) .

Можно передвигаться по словам:

boolean gotoNextWord(boolean Expand);
boolean gotoPreviousWord(boolean Expand);
boolean gotoEndOfWord(boolean Expand);
boolean gotoStartOfWord(boolean Expand);

Переменная Expand определяет будет ли курсор расширятся при своем передвижении.

Существует и множество других возможностей работы с курсором, но мы остановимся только на этом необходимом наборе.

3.2 Вставка текста по метке

Теперь рассмотрим вставку текста по меткам. Вообще, на мой взгляд, именно операции с метками являются самыми важными с точки зрения автоматизации работы на предприятии. Обычно создается типичный шаблон отчета, туда один раз забиваются все метки и все. Дальнейшая работа программ автоматизации каждый раз вставлять новые данне в этот шаблон по меткам. Поэтому отведем работе с метками повышенное внимание. За работу с метками отвечает интерфейс xBookmarksSupplier. В листинге 11 показан пример вставки текста по метке.

Как видно, начало этого метода ничем не отличается от предыдущего. Далее идут различия в получении метки. Для этого мы используем метод getBookmarks . Таким образом, мы получаем все метки, которые есть в документе. Далее мы можем найти метку, которая нам нужна. Для этого мы из всех меток выбираем метку с именем BookmarkName: BookmarksSupplier.getByName(BookmarkName) . Метод getAnchor возвращает текстовый объект, который относится к этой метке. Если такой метки в документе нет, возвращается сообщение об ошибке. Для отслеживания этой ошибки мы вводим переменную Flag : boolean. Если же метка обнаружена, мы можем вставлять текст с помощью метода setString , вызванного для этой метки. На этом разговор о OpenOffice.Writer будем считать законченным и перейдем к OpenOffice.Calc.

4.1 Основы работы с OpenOffice.Calc

Для того, чтобы начать работу с документом Calc, по аналогии с Writer’ом надо получить указатели вначале на листы, потом на конкретный лист и только потом на ячейку или диапазон ячеек. Таким образом, схема взаимодействия такова: ServiceManager -> Desktop -> Document -> Sheets -> Sheet -> Cell (Cells) .

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

Сделать это можно, например, при открытии файла. Отмечу, что переменные Sheets , Sheet , Cell объявлены как Variant .
После того, как мы получили указатель на все листы, надо получить указатель на конкретный лист. Сделать это можно либо по его индексу:

Определим процедуру, которая устанавливает текущий лист по его индексу (листинг 12).

4.2 Запись в ячейку по ее координатам

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

1. setValue;
2. setString;
3. setFormula.

Соответственно, первый вставляет число, второй — строку, третий — формулы. Чтобы получить значение, которое храниться в ячейке, надо в начале определить ее тип с помощью метода Cell.getType . Результатом работы будет одно из следующих значений:

1.0 — ячейка пуста;
2.1 — в ячейке число;
3.2 — строка;
4.3 — формула.

После этого можно узнать значение, для этого в зависимости от результата работы метода getType надо вызвать методы соответственно: getValue , getString , getFormula .

Единственное, что мы не сделали — не получили указатель на ячейку. Сделать это можно несколькими способами, в зависимости от цели. В листинге 13 приведен пример записи в ячейку текста, ячейка задается своими координатами.

В данном случае мы получаем ячейку по ее координатам:

Cell := Sheet.getCellByPosition(col, row) .

Потом записываем в эту ячейку текст.

4.3 Запись в ячейку по метке

Разобравшись с простым, перейдем к главному — работе с метками. Некоторые основы мы уже разобрали при работе с Writer’ом. Теперь будет легче. В листинге 14 приведен пример вставки текста в ячейку, которая задается меткой.

Разберемся подробнее. Переменная i:boolean — флаг для проверки метки на ее существование. j — счетчик для цикла проверки. Perem — количество листов в книге, которое мы можем получить с помощью метода getCount , вызванного для Sheets . Вначале мы устанавливаем указатель конкретного листа Sheet на первый лист в книге. И пытаемся найти метку, заданную именем Name на этом листе:

Если метки нет, то мы просто устанавливаем активным следующий лист и проверяем дальше пока не найдем такую метку или пока поймем, что такой метки нет (тогда выдается сообщение об ошибке). Если мы эту метку найдем, то записываем туда текст:

На этом работа этой функции заканчивается.

4.4 Запись массива в диапазон ячеек

Теперь будем работать с группой ячеек. Для примера рассмотрим вставку массива из четырех элементов в группу из четырех ячеек. Процедура приведена в листинге 15.

Параметрами этой процедуры являются четыре элемента, котрые мы должны вставить в ячейки, а также имя метки (Name), присвоенной диапазону ячеек. В начале мы создаем массив из четырех элементов и присваиваем им значения, которые мы передали функции.

Далее идет проверка на наличие метки в открытом документе, эта часть кода полностью повторяет код из листинга 14. Понятно, что ее можно выделить в отдельную функцию, что и было сделано (листинг 17).

Разница есть в методе записи массива. Делается это с помощью метода setDataArray . Аргументом этого метода является ранее созданный массив из четырех элементов.

4.5 Форматирование группы ячеек

Теперь рассмотрим функцию форматирования группы ячеек (листинг 16).

В этой процедуре используется метод GetRange, текст которого приведен в листинге 16. Этот метод просто возвращает указатель на группу ячеек.
Разберемся в параметрах, которые передаются этой функции. Name:String — имя присвоенной метки; FontName:String — имя шрифта; FontSize — размер шрифта; FontType — тип шрифта (жирный, курсив, подчеркнутый); FontColor — цвет шрифта в формате RGB; BackColor — цвет фона в формате RGB.

После получения указателя на диапазон ячеек мы проверяем параметры и устанавливаем новые свойства для этого диапазона. Если мы ввели новое имя шрифта, тогда мы устанавливаем этот шрифт для диапазона ячеек Name с помощью метода charFontName :

Точно также устанавливаем новый размер шрифта с помощью метода charHeight :

Теперь рассмотрим установку FontType . Вариантов значения параметра FontType может быть всего 8.

1.0 — тогда шрифт остается стандартным;
2.1 — тогда шрифт подчеркнутый;
3.2 — курсив;
4.3 — подчеркнутый + курсив;
5.4 — жирный;
6.5 — жирный + подчеркнутый;
7.6 — жирный + курсив;
8.7 — жирный + подчеркнутый + курсив.

Таким образом, мы делаем побитовую конъюнкцию FontType с константами 1, 2 и 4 и определяем тип шрифта, который нужно установить. Например, курсив устанавливаем так:

С цветом шрифта и цветом фона поступаем аналогично, за их установку отвечают методы CharColor и CellBackColor :

Range.charColor:=FontColor
Range.cellBackColor:=BackColor

Заключение

В заключении хочу отметить, что, конечно, то что мы рассмотрели не является избыточным. Однако, очень хочется верить, что пригодится многим, желающим самостоятельно начать рассматривать OpenOffice и делающих первые шаги в его автоматизации. В принципе, приведенных выше сведений с лихвой хватит для написания своего класса, который бы выполнял некоторые задачи, характерные для деятельности конкретной организации. Если же этих сведений не хватит, тогда Developer’s Guide и форум разработчиков ждут вас!

Что касается моей организации, то переход от Excel к OpenOffice был сделан. Чтобы полностью не отказываться от Excel была написана виртуальная функция, которая проверяла наличие на компьютере пользователя установленного OpenOffice, если он был найден, программа работала с классом автоматизации OpenOffice, в противном случае — работала с классом Excel.

От себя могу добавить, что поработав с OpenOffice я был приятно удивлен возможностями этого пакета. Честно говоря, такой функциональности получить от бесплатного пакета я не ожидал! Поэтому настоятельно вам советую поиграться в эти игры — оно того стоит!


[an error occurred while processing the directive]
Карта сайта