Страница 1 из 13

Работа с uOpenOffice

СообщениеДобавлено: 08.08.2011 09:20:56
sign
Сразу предупреждаю, что чайник и ещё раз чайник, потому за глупые вопросы не бить.
Попробовал подключить известный в широких кругах дельфийцев модуль uOpenOffice.
И тут же налетел на препятствие неодолимой силы.

Код: Выделить всё
function TOOCalcCell.GetDataType:TOpenDT;
begin
  Result:=FCellObj.Type;
end;

Собщение - "C:\lazarus\components\OOo\uOpenOffice.pas(4139,20) Fatal: Syntax error, "identifier" expected but "TYPE" found"

Это как-то (годятся даже теоретические ответы) преодолевается?

Re: Работа с uOpenOffice

СообщениеДобавлено: 08.08.2011 10:59:02
Xenar

Re: Работа с uOpenOffice

СообщениеДобавлено: 09.08.2011 10:06:13
sign
Спасибо, но это несколько не то.
В данном варианте не используется UNO, а самостоятельно открываются файлы, читается инфа, заполнятся чем нужно и т.д.

Мне бы хотелось, как в дельфийской библиотеке сделано, использовать всю мощь UNO.

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

Код: Выделить всё
function LoadFromURL(aFileName: string; const aFrameName: String; nSearchFlag: TSearchFlag): variant;
const
  ServerName = 'com.sun.star.ServiceManager';
var Server: variant;
    Desktop: variant;
    LoadParams: variant;
    Document: variant;
    S: ShortString;
begin
  if Assigned(InitProc) then TProcedure(InitProc);
  try
    Server := CreateOleObject(ServerName);
  except
    WriteLn('Не могу стартовать ОпенОфис.');
    Exit;
  end;
  // Распознать тип файла

  Desktop := Server.CreateInstance('com.sun.star.frame.Desktop');
  LoadParams := VarArrayCreate([0, -1], varVariant);
  S := UTF8ToCP1251(ConvertToURL(aFileName));
  Document := Desktop.LoadComponentFromURL(S, aFrameName, Ord(nSearchFlag), LoadParams);
  Result := Document;
end;           


И как вот теперь добраться для листа, например, или ячейки на листе?
Например, в ООо доступ к ячейке
Код: Выделить всё
Dim oDoc As Object, oSheet As Object, oCell As Object
oDoc = ThisDocument
oSheet = oDoc.Sheets.getByName("Sheet1")
oCell = oSheet.getCellByPosition(0, 0)


Пробую сделать в лазаре. :(
1.png


Чего-то я существенного не знаю...

Re: Работа с uOpenOffice

СообщениеДобавлено: 09.08.2011 12:21:15
Vadim
sign писал(а):Чего-то я существенного не знаю...

Например, как правильно называется лист, к которому Вы обращаетесь. :) Откройте файл в самом OpenOffice Calc и посмотрите на название. Будете весьма удивлены. ;)

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 11:05:16
Dane
Интересно, что никто так и не ответил на вопрос заданный в топикстарте. А было бы очень интересно получить ответ, т.к.там есть еще такие же затыки

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 11:14:52
Иван Шихалев
Support_for_&-escaping_of_keywords
По идее — именно для таких вещей. В версиях 2.4.x этого еще нет.

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 13:47:15
Ism
Насколько я знаю ole и uno это разные интерфейсы доступа .

Может это поможет
http://www.google.com.ua/search?q=openo ... afe=images
http://www.delphimaster.ru/articles/ope ... index.html

то что верно для ole и delphi должно работать и в lazarus

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

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 15:46:18
Dane
Дело в том, что данная ошибка, что приведена в первом посте топика, возникает еще на стадии компилирования с использованием модуля uOpenOffice.pas. На самом деле, человек только начал спотыкаться, т.к.при устранении проблем с данной строчкой он еще столкнется с подобной ошибкой далее (будет ругаться на .End и .String). Мне бы хотелось понять суть этих ошибок и что с этим делать, т.к.это единственный проект с использованием OLE, который хоть как-то можно было завести на Lazarus для работы с OpenOffice до ветки 2 включительно). Та библиотека, которую мне удалось приручить к Лазарю перестала работать при переходе к более свежей версии - выкидывает ошибки. А оба проекта работы через COM (uOpenOffice.pas и OpenOffice.pas - все взято с http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=405083&pg=27) ни под каким видом (даже в режиме совместимости с Delphi) под Lazarus не заводится (отваливается на стадии компиляции проекта). А проекты наиболее вменяемые для работы с OpenOffice и LibreOffice пакетами под Windows. Т.к. uno-bridge, spreadsheet и т.д.либо заброшены, либо имеют ужасающую схему использования. Помогите, плз, приручить проект - очень надо.

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 16:35:01
Ism
Вообщето openoffice кажется может работать через java интерфейс. Я давно об этом думал.
Теоретически можно связать Лазарус -> Java -> Openoffice .
Без всяких Оле. Правда в гугле так и не нашел как это сделать.
А ведь такая схема обещает надежное и кроссплатформенное управление Опенофисом .
Можно например запускать jar файлы с нужными макросами из командной строки из лазарус с опциями

Пока это только теория

Добавлено спустя 9 минут 57 секунд:
http://community.i-rs.ru/index.php?PHPS ... 9#msg56349
http://user.services.openoffice.org/en/ ... =45&t=1844
http://user.services.openoffice.org/en/ ... =45&t=3813

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 17:33:07
leo_bsv
Использую uOpenOffice для формирования таблиц во Writer... пишу на Lazarus всё работает, сам дописывал функционал под свои нужды, кстати
Xenar писал(а):Посмотрите здесь http://www.webdelphi.ru/2010/04/uchasti ... lya-linux/

как раз версия с добавленными мной процедурами и функциями, но в тексте примера куда-то пропали некоторые скобки... возможно что-то ещё... :shock:
Всё просто - файл ООо - это упакованная пачка хмл-документов... создаёте в редакторе то что хотели (Calc или Write), сохраняете в файл, распаковываете, и шаритесь по тексту в поисках нужной ноды, атрибута. После чего можете понять как к этому обратиться, а дальше дело техники - берёте DOM, XMLRead и XMLWrite и корректируете полученные файлы как надо, после чего запаковываете обратно, меняете расширение на .odt или какое там у эл.таблиц, открываете получившийся файл в редакторе и наслаждаетесь результатом. Никакого OLE никакого UNO всё просто до безобразия. :wink:

p.s.: естественно данный подход не даёт возможности работать в runtime, но зато гарантирует результат :)

Собственно вот кусок "живого" кода, прямо из программы:
Код: Выделить всё
var f: TextFile;
    sh, wp, ep, c1, c2, s1l, s1r, s2, path: string;
    OoWriter: TOoWriter;
    Table: TTable;
    i: integer;

  function GetLinesCount: integer;
  begin
     ...
  end;

  function GetCaption: string;
  begin
    ...
  end;

  function GetMOL: string;
  begin
     ...
  end;

  function GetAuthorAndTime: string;
  begin
    ...
  end;

  procedure GetSourceAndComment;
  begin
    ...
  end;

  procedure GetSt;
  begin
    ...
  end;
begin
  // Если ничего не выделено - выйдем
  if DocsG.Row=0 then exit;
  // Синхронизируем БД и таблицу
  DocsGSelection(nil,1,1);
  // Загрузим строки документа в IQ
  LoadDocStringsInIQ(DQ.FieldByName('docs_id').AsString);
  // Создадим файл
  OoWriter:=TOoWriter.Create;
  // Подгрузим шаблон
  if not OoWriter.LoadTemplate('blank.odt') then exit;
  // Подпишемся
  OoWriter.Generator:='LeoSKL';
  OoWriter.Author:='Leo';
  // Вставим данные
  OoWriter.FindAndReplace('_Контакты',GetContacts);
  OoWriter.FindAndReplace('_Заголовок',GetCaption);
  OoWriter.FindAndReplace('_МОЛ',GetMOL);
  OoWriter.FindAndReplace('_АвторВремя',GetAuthorAndTime);
  GetSourceAndComment;
  OoWriter.FindAndReplace('_Основание',c1);
  OoWriter.FindAndReplace('_Комментарий',c2);
  // Заполним таблицу
  Table:=OoWriter.GetTable('Таблица1');
  Table.MultiplyRow(1,GetLinesCount-1);
  i:=1;
  while not IQ.EOF do begin
    with Table do begin
      FindAndReplace(i,'_№',IntToStr(i));
      FindAndReplace(i,'_Наим',IQ.FieldByName('name').AsString);
      FindAndReplace(i,'_Колич',IQ.FieldByName('count').AsString);
      FindAndReplace(i,'_ЕдИзм',IQ.FieldByName('meas').AsString);
      FindAndReplace(i,'_Цена',IQ.FieldByName('price').AsString);
      FindAndReplace(i,'_Сумма',IQ.FieldByName('sum').AsString);
    end;
    inc(i);
    IQ.Next;
  end;
  Table.FindAndReplace(i,'_Итого',GetFromBase('select sum(sum) '+
    'from doc_strings where docs_id='+DQ.FieldByName('docs_id').AsString));
  // Вставим остальные данные
  GetSt;
  OoWriter.FindAndReplace('_Строка1Слева',s1l);
  OoWriter.FindAndReplace('_Строка1Справа',s1r);
  OoWriter.FindAndReplace('_Строка2',s2);
  OoWriter.ShowDocument;                                   
end;

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 18:46:08
Dane
Прошу прощения, но делать таблицы в текстовом редакторе это то еще извращение. Я своих пользователей отучаю от такого с матами :0)
Очень удобно было пользоваться переделанной мною библиотекой под Lazarus (как раз uOpenOffice.pas переписывал, т.к.она не компилилась в натуральном виде). Только под новой версией офиса она не работает с Calc.
Буду, конечно, пробовать работать с прямой записью в файл. Но, все-таки, хотелось понять почему выскакивают такие ошибки и что с ними надо делать

Re: Работа с uOpenOffice

СообщениеДобавлено: 13.10.2011 20:12:34
leo_bsv
Dane писал(а):делать таблицы в текстовом редакторе это то еще извращение

кстати как оказалось - не так уж плохо - в шаблоне может быть куча разных таблиц, каждая имеет своё имя, свой формат и к каждой можно обращаться "лично",
другое дело что у меня нет нужды после выгрузки данных из своей программы производить какие-то расчёты - все расчёты производятся в программе.
мне в uOpenOffice нравится то что документ можно накидать прямо в редакторе, сохранить а потом использовать, редактировать и т.д. динамические навороты мне не нужны.
готового решения по поводу эл. таблиц не знаю - не припирало пока ))
может быть у кого-то появится стимул :twisted: и добьют в конец эту историю ))

Re: Работа с uOpenOffice

СообщениеДобавлено: 14.10.2011 06:48:42
sign
Я под свои нужды нафигачил такие вот модули (на основе uOpenOffice и прочего).
У меня всё замечательно работает и, мало того, легко добавить любой функциональности.

Попробовал сюда добавить zip размером 12 КБ, однако получил по зубам - "Достигнут максимальный общий размер ваших сложений".
:cry:

Хотя имеем
"Вложения

Это список вложений в сообщениях, оставленных на этой конференции.

Вы не создали ни одного вложения."

Re: Работа с uOpenOffice

СообщениеДобавлено: 14.10.2011 10:22:04
Dane
Уважаемые софорумчане! Если кому не трудно, киньте хотя бы через обменник рабочие библиотеки на подобии uOpenOffice. Хотя бы сравню с тем, что у меня получилось и поучусь адаптации :0)

Re: Работа с uOpenOffice

СообщениеДобавлено: 14.10.2011 17:35:51
Astralis
Ism писал(а):Вообщето openoffice кажется может работать через java интерфейс. Я давно об этом думал.
Теоретически можно связать Лазарус -> Java -> Openoffice .
Без всяких Оле. Правда в гугле так и не нашел как это сделать.
А ведь такая схема обещает надежное и кроссплатформенное управление Опенофисом .
Пока это только теория

Тут дело не в java, а в интерфейсе uno - он кроплатформенный. Для java, mono, c++ и python уже есть готовые библиотеки, для freepascal и delphi проект нескольких энтузиастов быстро зачах. В большинстве случаев гораздо проще и быстрее либо отказаться от кроссплатфоменности (использовать OLE), либо написать модуль на другом языке ( в том числе скриптами с самом LibreOffice), либо использовать lazreport, нежели мучаться с типами вызова thiscall.