Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  121

•  TDictionary Custom Sort  3 309

•  Fast Watermark Sources  3 059

•  3D Designer  4 813

•  Sik Screen Capture  3 310

•  Patch Maker  3 526

•  Айболит (remote control)  3 627

•  ListBox Drag & Drop  2 988

•  Доска для игры Реверси  81 511

•  Графические эффекты  3 916

•  Рисование по маске  3 223

•  Перетаскивание изображений  2 606

•  Canvas Drawing  2 729

•  Рисование Луны  2 552

•  Поворот изображения  2 161

•  Рисование стержней  2 160

•  Paint on Shape  1 564

•  Генератор кроссвордов  2 223

•  Головоломка Paletto  1 764

•  Теорема Монжа об окружностях  2 209

 

 

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

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

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

 

Delphi Sources

Delphi Sources

СТАТЬИ

 

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

 

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


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

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

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

Sheets := Document.GetSheets

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

Sheet := Sheets.getByIndex(Index);

   либо по имени:

Sheet := Sheets.getByName('Sheet_Name').

   Определим процедуру, которая устанавливает текущий лист по его индексу (листинг 12).
 
Листинг 12
procedure TOpenOffice.GetSheet(const Index :Word);
begin
   Sheet := Sheets.getByIndex(Index);
end;

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

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

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

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

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

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

   Единственное, что мы не сделали – не получили указатель на ячейку. Сделать это можно несколькими способами, в зависимости от цели. В листинге 13 приведен пример записи в ячейку текста, ячейка задается своими координатами.
 
Листинг 13
procedure TOpenOffice.InsertTextByCoord(const Text: String;
                                      col:integer; row:integer);
begin
   Cell := Sheet.getCellByPosition(col, row);
   Сell.setString(Text);
end;

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

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

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

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

   Разобравшись с простым, перейдем к главному – работе с метками. Некоторые основы мы уже разобрали при работе с Writer'ом. Теперь будет легче. В листинге 14 приведен пример вставки текста в ячейку, которая задается меткой.
 
Листинг 14
procedure TOpenOffice.InsertTextByName(const Text: String;
                                                    Name: String);
var
   i:boolean;
   j:integer;
   Perem :longint;
begin
   Perem:=0;
   Perem:=Sheets.getCount;
   j:=0;
   repeat
      i:=True;
      Sheet := Sheets.getByIndex(j);
      try
         Sheet.getCellRangeByName(Name);
      except
         j:=j+1;
         i:=False;
         Perem:=Perem-1;
      end;
   until (i or (Perem=1));
   if(Perem=1) then ShowMessage('Нет такой метки')
   else
      begin
         Cell:=Sheet.getCellRangeByName(Name);
         Cell.setString(Text);
       end;
end;

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

try
  Sheet.getCellRangeByName(Name).

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

Cell.setString(Text).

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

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

   Теперь будем работать с группой ячеек. Для примера рассмотрим вставку массива из четырех элементов в группу из четырех ячеек. Процедура приведена в листинге 15.
 
Листинг 15
procedure TOpenOffice.InsertTableByName(Text1:String;
         Text2:String; Text3:String; Text4:String; Name:String);
const Bounds:array[1..4] of integer = (1,2,1,2);
var
   VariantArray:Variant;
   i:boolean;
   j:integer;
   Range: Variant;
   Perem :longint;
begin
   VariantArray := VarArrayCreate(Bounds, varVariant);
   Perem:=0;
   Perem:=Sheets.getCount;
   VariantArray[1,1]:=Text1;
   VariantArray[1,2]:=Text2;
   VariantArray[2,1]:=Text3;
   VariantArray[2,2]:=Text4;
   j:=0;
   repeat
      i:=True;
      Sheet := Sheets.getByIndex(j);
      try
         Sheet.getCellRangeByName(Name);
      except
         j:=j+1;
         i:=False;
         Perem:=Perem-1;
      end;

   until (i or (Perem=1));
   if(Perem=1) then ShowMessage('Нет такой метки')
   else
      begin
          Range:=Sheet.getCellRangeByName(Name);

          Range.setDataArray(VariantArray);
       end;
end;

   Параметрами этой процедуры являются четыре элемента, котрые мы должны вставить в ячейки, а также имя метки (Name), присвоенной диапазону ячеек. В начале мы создаем массив из четырех элементов и присваиваем им значения, которые мы передали функции.
 
VariantArray := VarArrayCreate(Bounds, varVariant);
VariantArray[1,1]:=Text1;
VariantArray[1,2]:=Text2;
VariantArray[2,1]:=Text3;
VariantArray[2,2]:=Text4;

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

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

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

   Теперь рассмотрим функцию форматирования группы ячеек (листинг 16).
 
Листинг 16
procedure TOpenOffice.RangeFormat(Name:String; FontName:String;
       FontSize, FontType, FontColor, BackColor:longint);
var
 font: TFont;
 Range: Variant;
begin
   Range:=GetRange(Name);
   if FontName <> '' then Range.charFontName:=FontName;
   if FontSize <> 0 then Range.charHeight:=FontSize;
   if FontType <> -1 then
      begin
         if(FontType and $04)=4 then
            Range.charWeight:=fsBold else
            Range.charWeight:=0;
         if(FontType and $02)=2 then
            Range.charPosture:=fsItalic else
            Range.charPosture:=0;
         if(FontType and $01)=1 then
            Range.charUnderline:=fsUnderline else
            Range.charUnderline:=0;
      end;
      if FontColor <> -1 then
         Range.charColor:=FontColor;
      if BackColor <> -1 then
         Range.cellBackColor:=BackColor;
end;

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

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

Range.charFontName:=FontName

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

Range.charHeight:=FontSize;

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

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

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

Range.charPosture:=fsItalic.

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

Range.charColor:=FontColor
Range.cellBackColor:=BackColor
 
Листинг 17
function TOpenOffice.GetRange(Name: String): Variant;
var
   i: integer;
   Sheet: Variant;
begin
   for i := 0 to Sheets.getCount - 1 do
   try
        Sheet  := Sheets.getByIndex( i );
        Result := Sheet.getCellRangeByName( Name );
        if not ( VarIsEmpty(Result) or VarIsNull(Result)) then
        Exit;
   except
     Result := Null;
   end;
end;


Заключение

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

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

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

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

Дата: 14.05.2007, Автор: Васильков Ю. В.



Назад

   

 














































































































































































































 

© 2004-2024 "DS"

Соглашение пользователя / Реклама / Карта сайта             Created by BrokenByte Software