powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi & OpenOffice - Заполним пробел
25 сообщений из 929, страница 1 из 38
Delphi & OpenOffice - Заполним пробел
    #34381137
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начну с очень грустного для себя открытия, что информации по работе с OpenOffice очень трудно найти даже на английском языке.
И попрошу заранее особо умных не умничать, и не кидать умных ссылок
(сам могу накидать http://www.oooforum.org/forum/viewforum.phtml?f=2),
я их за неделю насмотрелся большая просьба выкладывать рабочие примеры, а не их кусочки.

Это топ изначально планируется, для того чтобы больше не тратить по недели на то, что бы узнать, как объединить ячейки и т.д. (Кстати весьма буду благодарен если кто подскажет мой самый большой камень сейчас)
Ну а для начал этого топа выложу то, что смог найти или методом тыка нашел, чтобы Вы не потратили столько времени, сколько я на пойки.

Первый пример и очень классный я нашел на сайте http://www.rsdn.ru/Forum/?mid=1187888

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
 procedure  TForm1.Button1Click(Sender: TObject);
 var 
  LoadParams, aLoader: Variant;
  ServiceManager, Desktop : Variant;
  CoreReflection, PropertyValue, VA: Variant;
  Document: Variant;
  TableCursor, Table, TableCell : Variant;
  obj, objText, objCursor : Variant;
  w : integer;
  Cols : Variant;
 begin 
   if  VarIsEmpty(ServiceManager)  then 
     try 
      ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
     except 
       Raise  Exception.Create('Couldn''t get ServiceManager');
      Exit;
     end ;

  CoreReflection := ServiceManager.createInstance('com.sun.star.reflection.CoreReflection');
  CoreReflection.forName('com.sun.star.beans.PropertyValue').createObject(PropertyValue);
  VA := VarArrayCreate([ 0 ,  0 ], varVariant);
  VA[ 0 ] := PropertyValue;

  Desktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
  Document := Desktop.LoadComponentFromURL( 'private:factory/swriter','_blank',  0 ,  VA);
   if  (VarIsNull(Document)  or  VarIsEmpty(Document))  then 
      begin 
        Raise  Exception.Create('Couldn''t create document');
       Exit;
      end ;

  objText := Document.getText;
   //Create a cursor object 
  objCursor := objText.createTextCursor;

   //Inserting some Text 
  objCursor.setPropertyValue('CharHeight', 12 );  //size 
  objCursor.setPropertyValue('CharWeight', 150 ); //bold 
  objCursor.setPropertyValue('ParaAdjust', 3 );   //center 
  objText.insertString(objCursor, 'The first line.', false);
  objText.insertControlCharacter(objCursor,  0 , false );  //PARA_BREAK 
  objText.insertControlCharacter(objCursor,  1 , false );  //LINE_BREAK 
  objText.insertControlCharacter(objCursor,  0 , false );  //PARA_BREAK 

  objCursor.setPropertyValue('CharHeight', 20 );  //size 
  objCursor.setPropertyValue('CharWeight', 150 ); //bold 
  objCursor.setPropertyValue('ParaAdjust', 0 );   //left 
  objCursor.setPropertyValue('CharUnderline', 1 ); //0-none, 1-single,...,18-BOLDWAVE 
  objText.insertString(objCursor, 'The second line.', false);

  objCursor.setPropertyValue('CharHeight', 12 );  //size 
  objCursor.setPropertyValue('CharWeight', 100 ); //normal 
  objCursor.setPropertyValue('CharUnderline', 0 ); //0-none 
  objText.insertString(objCursor, 'The second line.', false);

  objText.insertControlCharacter(objCursor,  0 , false );  //PARA_BREAK 
  objText.insertControlCharacter(objCursor,  0 , false );  //PARA_BREAK 

   //Inserting some Table 
  Table := Document.createInstance( 'com.sun.star.text.TextTable' );
  Table.initialize( 5 ,  4 );   //row, column 
  Table.HoriOrient :=  0 ;
  Table.LeftMargin :=  200 ;  // 2* 1/100 mm; 
  Table.RightMargin :=  200 ;

  Document.getText.insertTextContent( objCursor, Table, false );

  obj := Table.TableColumnSeparators;
  obj[ 0 ].Position :=  750 ;
  obj[ 1 ].Position := obj[ 0 ].Position+ 2000 ;
  obj[ 2 ].Position := obj[ 1 ].Position+ 2000 ;

  Table.TableColumnSeparators := obj;

   //   Cols := Table.getColumns; 
   //   w :=  Cols.getCount; 

  TableCell := Table.getCellByName('A1');
  TableCell.setString('A1');
  TableCell := Table.getCellByPosition( 1 ,  1 );
  TableCell.setString('**B2**');
  TableCell := Table.getCellByPosition( 2 ,  1 );
  TableCell.setString('**C2**');

 end ;

-----------------------------------------------------------
Вот что я смог сделать

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
 procedure  TForm1.Button1Click(Sender: TObject);
 var 
StarOffice, StarDesktop, Document, Sheets, Sheet, MyStruct, Cell: variant;
J, I: integer;
 begin 
  StarOffice := CreateOleObject('com.sun.star.ServiceManager');

  StarDesktop := StarOffice.createInstance('com.sun.star.frame.Desktop');
  Document := StarDesktop.LoadComponentFromURL(
                  'private:factory/scalc', '_blank',  0 ,
                  VarArrayCreate([ 0 , - 1 ], varVariant));
  MyStruct := StarOffice.Bridge_GetStruct('com.sun.star.table.BorderLine');

     try 

    Sheets := Document.getSheets;
    Sheet := Sheets.getByName('Лист1');
    Cell := Sheet.getCellRangeByName('C10:C13'); // cell := sheet.getCellRangeByPosition(0, 1, 0, 3); 
    Cell.setPropertyValue('CellBackColor',  255 ); //  Cell.cellBackColor :=200; 
  //   Cell.setPropertyValue('GoToCell');  //как сд 

    J :=  1 ; I :=  1 ;
    Cell := Sheet.getCellByPosition(j, i);
    // Cell.charColor := 255; 
    Cell.charHeight :=   14 ;
    Cell.CharWeight:=  150 ;
    Cell.charUnderline := true;
    Cell.charPosture := true;
    Cell.charStrikeout  := true;


    Cell.SetString('САЛЬДОВО-ГРУППИРОВОЧНАЯ ВЕДОМОСТЬ ПО УСЛУГЕ:');

    Cell := Sheet.getCellByPosition(j, i+ 1 );
       //MyStruct.color := 255; 
    MyStruct.lineDistance  :=  0 ;
    MyStruct.innerLineWidth :=  0 ;
    MyStruct.outerLineWidth :=  1 ;
    Cell.leftBorder :=  MyStruct;
    Cell.rightBorder := MyStruct;
    Cell.topBorder := MyStruct;
    Cell.bottomBorder := MyStruct;

    Cell.SetString('Дом: ');


   finally 
    StarOffice := Unassigned;
   end ;
 end ;
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34382618
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кто знает как в calc объединить ячейки плиз подсказать очень нужно
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34382946
Упс!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создай Uno - сервис, да и рули им, через метод executeDispatch.

объект.executeDispatch(документ, 'команда', '', 0, значение_свойства)

Например,
значение_свойства(0).Name = 'ToPoint';
значение_свойства(0).Value = "$B$5:$E$7"

Команды известны:
'.uno:GoToCell' - выбор ячеек
'.uno:ToggleMergeCells' - объединение
...
... только свойства прваильно заполняй, и все.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383164
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fokissЕсли кто знает как в calc объединить ячейки плиз подсказать очень нужно

Маетесь глупостями, IMHO.

OpenOffice, как таковой, вполне спокойно понимает базовый формат Excel (BIFF).

Для формирования файлов - вполне достаточно средств вроде NativeExcel или XLSReadWriteII.

И уже совсем отдельный вопрос - это открытие, печать, предпросмотр файлов (тот самый минимум средств для управления со стороны конечного приложения).

И все. Цена вопроса - общее средство формирования файлов напрямую (с интерфейсом а-ля COM) и пара интерфейсных классов (которые нужны только в части запуска предпросмотра, ибо печать и открытие делаются через ShellAPI не в пример куда более надёжно, чем через COM/OLE).
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383538
Я!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grexhide
OpenOffice, как таковой, вполне спокойно понимает базовый формат Excel (BIFF).

Для формирования файлов - вполне достаточно средств вроде NativeExcel или XLSReadWriteII.

Ну, и MSO понимает формат OpenOffice (.ods файлы). :)

А вот из "NativeExcel или XLSReadWriteII" в OO - что называется, "без гарантии качества". Плавали, знаем.
Может разработчики доберутся до поддержки ОО. Хотя ради чего им так стараться?

grexhide
И все. Цена вопроса - общее средство формирования файлов напрямую (с интерфейсом а-ля COM) и пара интерфейсных классов (которые нужны только в части запуска предпросмотра, ибо печать и открытие делаются через ShellAPI не в пример куда более надёжно, чем через COM/OLE). :+1
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383584
Фотография grexhide
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я!!А вот из "NativeExcel или XLSReadWriteII" в OO - что называется, "без гарантии качества". Плавали, знаем. Может разработчики доберутся до поддержки ОО. Хотя ради чего им так стараться?


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

Или что имеется в виду под "гарантией качества"?.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383601
Я!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Было дело: раскрашивал вертикально расположенные надписи: получилось, что при открытии в ОО фон с цветом шрифта совпал. В МО - нормально.
Еще было пару раз, когда на итоговом личе были формулы, ссылающиеся на другие листы. В ОО оторбазилось как "Ошибка в формуле".

Подробностей не помню, но эксперименты прекратил. :)
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383669
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Давайте не возводить дебаты, а давать просто пример и ответы.
Большое спасибо гостю я вот пример выложу кому может пригодится.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 procedure  TForm1.Button4Click(Sender: TObject);
 var 
  OOServiceManager, OODispatcher, OODocument, OODesktop: Variant;
  ooParams, ooFrame: Variant;

 begin 

 OOServiceManager := CreateOleObject('com.sun.star.ServiceManager');
 OODesktop:= OOServiceManager.createInstance('com.sun.star.frame.Desktop');
 OODocument := OODesktop.LoadComponentFromURL( 'private:factory/scalc', '_blank',  0 , VarArrayCreate([ 0 , -  1 ], varVariant));

 OODispatcher := ooServiceManager.createInstance('com.sun.star.frame.DispatchHelper');

 ooFrame:=OODocument.getCurrentController.getFrame;
 ooParams:= VarArrayCreate([ 0 ,  0 ], varVariant);


 ooParams[ 0 ] := OOServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');

 ooParams[ 0 ].name := 'ToPoint';
 ooParams[ 0 ].value := '$F$3:$F$5';
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '',  0 , ooParams);
 ooDispatcher.executeDispatch(ooFrame, '.uno:ToggleMergeCells' , '',  0 , ooParams);

 ooParams[ 0 ].name := 'ToPoint';
 ooParams[ 0 ].value := '$F$13:$F$15';
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '',  0 , ooParams);
 ooDispatcher.executeDispatch(ooFrame, '.uno:ToggleMergeCells' , '',  0 , ooParams);




 ooParams[ 0 ].name := 'ToPoint';
 ooParams[ 0 ].value := '$F$23:$F$25';

 ooParams[ 0 ].name := 'Color';
 ooParams[ 0 ].value :=  16711680  ;
 ooDispatcher.executeDispatch(ooFrame, '.uno:GoToCell', '',  0 , ooParams);
 ooDispatcher.executeDispatch(ooFrame, '.uno:Color', '',  0 , ooParams);

 end ;

Подскажите как сделать если нужен массив > 0
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34383926
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста как с помощью uno сделать рамку ячейки
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34384082
Я!!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fokissПодскажите пожалуйста как с помощью uno сделать рамку ячейки

Сперва выбираете нужную ячейку, потом командой: ".uno:SetBorderStyle" обрамляем.
Трудность в параметре: массив типа PropertyValue, длиной 4.
Для Name задаются OuterBorder.LeftBorder, OuterBorder.RightBorder, OuterBorder.TopBorder, OuterBorder.BottomBorder, а также (если несколько ячеек) - то InnerBorder.Horizontal, InnerBorder.Vertical (если эти параметры, то массив длиной не 4, а 6).
Для значений Value задать массив [0..3], описывающий стиль линии.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34384719
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати объединение ячейк в оле делается так
Код: plaintext
Cell := Sheet.getCellRangeByName('A4:D4').Merge(true);

Я!! Сперва выбираете нужную ячейку, потом командой: ".uno:SetBorderStyle" обрамляем.
Трудность в параметре: массив типа PropertyValue, длиной 4.
Для Name задаются OuterBorder.LeftBorder, OuterBorder.RightBorder, OuterBorder.TopBorder, OuterBorder.BottomBorder, а также (если несколько ячеек) - то InnerBorder.Horizontal, InnerBorder.Vertical (если эти параметры, то массив длиной не 4, а 6).
Для значений Value задать массив [0..3], описывающий стиль линии.

Пример бы не мог бы скинуть?
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34386361
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может кто подскажет как через Оле выронить по вертикали
По горизонтали так
Код: plaintext
Cell.ParaAdjust :=  3 ; 
а по вертикали подскажите плиз
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34392547
demka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Объединение ячеек например так:
Sheet.getCellRangeByPosition( 1, 1, 5, 1).Merge(true)

Только учтите что в ОО адресация ячеек идет наоборот, т.е. сначала столбец потом строка. Например в данном случае getCellRangeByPosition( НачСтолбец, НачСтрока, КонСтолбец, КонСтрока)

Ну и почитайте вот это
http://www.rsdn.ru/article/openoffice/ooautomation.xml
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34399209
fokiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите как через Оле выронить по вертикали???
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34453085
Фотография Сидоров Сидор Сидорович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу сказать большое спасибо автору за данную тему.
Я сам уже больше месяца стараюсь привыкнуть к ОО, после того как у нас отказались от закупки лицензионного MSOffice. Многое уже осознал, но вот не могу решить одну проблемку: как мне НЕ СОЗДАВАТЬ новый документ *.ods, а открыть существующий - забить в него данные и сохранить его под новым именем, но не закрывать. Всё это надо проделывать автоматически по нажатию на одну тока кнопку "Отчёт". В екселе у меня всё это делалось легко и быстро, а вот с ОО я подзавис, и пока главная моя беда - не могу открыть существующий так сказать шаблон. ПОМОГИТЕЕЕЕЕЕЕЕ!!!!
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34453398
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fokissПервый пример и очень классный

Код: plaintext
1.
2.
3.
4.
5.
     try 
      .....
     except 
       Raise  Exception.Create('Couldn''t get ServiceManager');
      Exit;
     end ;

Надо признать, пример действительно неординарный.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34455266
Фотография Сидоров Сидор Сидорович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к вопросу про открытие файла - подскажите!!!!
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34457581
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выкладываю небольшой модуль для работы с OO Calc. В архиве сам модуль и небольшой тестовый проект для проверки. Сделано в Delphi6.
Вся работа через OLE. Может, кому пригодится. Дорабатывайте, кому что надо.
Код используется в работающем проекте.
Идея отсюда http://www.codenet.ru/progr/bcb/Open-Office-Calc-Automation.php
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34467626
hor-olga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
тема перехода на openoffice - возникла и у нас на предприятии
все отзывы очень помогли, чтобы разобраться для начала
что не получается - так это управлять в CALC ориентацией страницы,
размером (а3 а4), полями
Плиз, помогите где искать или подскажите кто может
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34467725
Фотография NextMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
args[...].Name := 'Orientation';
args[...].Value := 'Potrait';
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34471064
hor-olga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос к Yurik74.
Скачала выш пример, смотрела ссылку.
На основании вашего примера не получ сделать WrapText ячейке
и установить параметры страницы (альбомная, А4, поля)
где можно почитать как вы строили свой пример???
плиз , очень нужно
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34471100
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hor-olgaСкачала выш пример, смотрела ссылку.
На основании вашего примера не получ сделать WrapText ячейке
и установить параметры страницы (альбомная, А4, поля)
где можно почитать как вы строили свой пример???
плиз , очень нужно
WrapText уже есть, код на работе, завтра выложу, параметры страницы тоже есть (сделал вчера после вашего предыдущего поста, нам в работе это не надо). Просто код в постоянной доработке, но уже используется. Я свой код строил, исходя из того, что нам надо только вывести отчет в Calc, а дальше пользователь уже сам решает, что с ним делать - печатать, сохранять и т.д. Поэтому там почти нет методов на чтение свойств. В принципе, можно сделать и печать, и сохранение, все это можно сделать в скрытом режиме, не выводя окно Calc на экран.
Код основан на том, что есть в ссылке выше + OpenOffice SDK. Правда в SDK почти все на Java, приходится думать и много экспериментировать. Правда, можно перейти на использование UNO (лениво :) ), в этом случае проще, можно необходимые действия записать в макрос и посмотреть его код.
Интересно, мой код помог? Если так, очень рад.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34471641
hor-olga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yurik74
До конца еще не разобралась, но код уже помог
Если делать обратный процесс(из OO куда грузить),
можно использовать этот же код?
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34473447
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hor-olgaно код уже помог
Это хорошо :)
hor-olga
Если делать обратный процесс(из OO куда грузить), можно использовать этот же код?
Да, можно, там, где не используется CellRange, а идет обращение к одной ячейке или там, где установка чего-либо другого, например, цвета. Опиши метод на чтение свойства и в нем
Код: plaintext
Result:=(то, чему идет присвоение в методе записи)
Несколько ссылок:
ресурс, посвященный макросам OpenOffice.org
и
конкретная дока оттуда на Basic
Выкладываю свой код, уже в Delphi2006.
...
Рейтинг: 0 / 0
Delphi & OpenOffice - Заполним пробел
    #34473453
Yuric74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sorry
...
Рейтинг: 0 / 0
25 сообщений из 929, страница 1 из 38
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi & OpenOffice - Заполним пробел
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]