Работа с uOpenOffice

Библиотеки для работы с офисными пакетами (OpenOffice, MS Office и т.п.)

Модератор: Модераторы

Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

можете сюда, можете сюда
volodya25
новенький
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Сообщение volodya25 »

Создаваемый файл теперь всегда имеет название doc.odt и открывается программой по умолчанию.
Патч:

Код: Выделить всё

*** odfproc.pas   2011-11-09 21:39:08.522435327 +0300
--- odfproc.pas.1   2011-11-09 21:33:21.000000000 +0300
***************
*** 482,492 ****
    exe_path:=ExtractFilePath(Application.ExeName);
 
    {$IFDEF Linux}
!   templ_path:=exe_path+'template/';
!   GenerateDocument(templ_path,'doc','');
    try
      Proc:=TProcess.Create(nil);
!     Proc.CommandLine:='ooffice -writer '+templ_path+'doc.odt';
      Proc.Options:=[poWaitOnExit];
      Proc.ShowWindow:=swoShowMaximized;
      Proc.Execute;
--- 482,492 ----
    exe_path:=ExtractFilePath(Application.ExeName);
 
    {$IFDEF Linux}
!   templ_path:=exe_path+'temp/';
!   GenerateDocument(templ_path,'doc.odt','');
    try
      Proc:=TProcess.Create(nil);
!     Proc.CommandLine:='xdg-open '+templ_path+'doc.odt';
      Proc.Options:=[poWaitOnExit];
      Proc.ShowWindow:=swoShowMaximized;
      Proc.Execute;

Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

volodya25, спасибо за участие, изменения внесены.
новая ревизия файла доступна тут
если есть желание могу добавить вас как разработчика проекта на SF - сможете сами вносить изменения.
для добавления нужен ваш логин на SF.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

v-t-l писал(а):Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!

Спасибо, добавлено как задание по оптимизации на SF! Рассмотрим!
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

leo_bsv писал(а):
v-t-l писал(а):Кстати, для открытия сгенерированного документа программой по умолчанию можно использовать кроссплатформенную (win,unix,mac) функцию OpenDocument из модуля LCLIntf!

Спасибо, добавлено как задание по оптимизации на SF! Рассмотрим!

Всем доброго! Во-первых, еще раз большое спасибо всем за модуль - пользую, не нарадуюсь.
Под себя доработал процедуру ShowDocument для именования выходного файла и указания path для запуска writer (или swriter) - так, на мой взгляд, дешевле, чем использовать программу по умолчанию.
Собственно доработка

Код: Выделить всё

procedure TOdt.ShowDocument(n_path,name_doc:String);//жесткий путь запуска и имя док-та
var exe_path, templ_path, sh: string; //если n_path='' или name_doc='' то запуск или имя по умолчанию
    f_name: string = 'doc.odt';
    Proc: TProcess;
begin
  exe_path:=ExtractFilePath(Application.ExeName);
  {$IFDEF Linux}
  templ_path:=IncludeTrailingPathDelimiter(exe_path+'temp');
  if Trim(name_doc)<>'' then f_name:=name_doc+'.odt';
  GenerateDocument(templ_path,f_name,'');
  try
    Proc:=TProcess.Create(nil);
    if Trim(n_path)<>'' then
    Proc.CommandLine:=Trim(n_path)+' '+templ_path+f_name
    else
    Proc.CommandLine:='xdg-open '+templ_path+f_name;
    Proc.Options:=[poWaitOnExit];
    Proc.ShowWindow:=swoShowMaximized;
    Proc.Execute;
  finally
      sleep(2000);//пару сек ждем - иногда приложение по умолчанию не успевает запуститься
     if Proc.WaitOnExit then begin
      Proc.CommandLine:='rm '+templ_path+' -r';
      Proc.Execute;
      Proc.Free;
    end;
  end;
  {$ENDIF}
end;
Последний раз редактировалось Владимир 13.12.2011 15:05:45, всего редактировалось 2 раза.
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Просто кто-то использует AbiWord, кто-то KWord... мб на самом деле проще сделать чтобы открывалось редактором по-умолчанию?
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

leo_bsv писал(а):volodya25, спасибо за участие, изменения внесены.

Доброго! У меня не работает вызов Table.AppendRow('Standard'); - ругань на Integer

Код: Выделить всё

procedure TOdtTable.AppendRow(TextStyle: string);
var Root, Node: TDOMNode;
    i:integer;
begin
  Node:=FDocument.CreateElement('table:table-row');
  Root:=RootNode.AppendChild(Node);//Root = table:table-row
   for i:=1 to Cols do
    begin
       Node:=FDocument.CreateElement('table:table-cell');
        TDOMElement(Node).SetAttribute('table:style-name',DefoultCellStyle);
        TDOMElement(Node).SetAttribute('office:value-type','string');
      Root:=Root.AppendChild(Node);//root = table:table-cell
      Node:=FDocument.CreateElement('text:p');
        if length(TextStyle)>0 then
          TDOMElement(Node).SetAttribute('text:style-name',TextStyle)
        else
          TDOMElement(Node).SetAttribute('text:style-name',DefTextStyle);
      Root.AppendChild(Node);
      Root:=Root.ParentNode;//Root = table:table-row
    end;
end;

Похоже, Cols не определена. Также не работает Table.AppendColumn('Standard');
Или я чего не понимаю?
Далее (пробую роль тестера)
Table.RemoveRow; - работает
Table.MultiplyRow(1,1);- работает
Table.Cell[0,2]:='bla-bla';- работает
Чтение Table.Rows;- работает
Чтение Table.Cols;- не работает
Table.RemoveEmptyRow('bla-bla');- не работает (вешает все)
Пока все.
ps. В целом все неплохо, работать можно.
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Приложил код доработанной процедуры ShowDocument к своему сообщению от 08.12
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Владимир писал(а):Table.RemoveEmptyRow('bla-bla');- не работает (вешает все)

Да, процедура не доделана, у меня пока не хватает времени... ваши замечания зафиксированы здесь
Спасибо за активнось. Как появится возможность - изменения будут внесены.
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Владимир писал(а):Приложил код доработанной процедуры ShowDocument к своему сообщению от 08.12

ShowDocument сделана перегружаемой, теперь может запускаться как с параметрами, так и без, если не сложно - проведите тестирование.
Файл можно скачать по этой ссылке
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

ShowDocument сделана перегружаемой, теперь может запускаться как с параметрами, так и без, если не сложно - проведите тестирование.

Не сложно. Запуск без параметров ('','') валит все. Если указывать пробелы, то:

Код: Выделить всё

ODT:=TOdt.Create;
  ODT.LoadTemplate('/arch/shop/template/cennik.odt');
  ODT.ShowDocument(' ',' ');//ошибка чтения /temp
 // ODT.ShowDocument(' ','ddd.odt');//нет запуска по умолчанию
 //ODT.ShowDocument('/opt/openoffice.org3/program/swriter','ddd.odt');//работает
 //ODT.ShowDocument('/opt/openoffice.org3/program/swriter',' ');//открывает док и валится
  Odt.Destroy;

Не очень понятно - а зачем перегрузка функции? С точки зрения вызова с параметрами/без и "правильности" - ну, может быть... Зачем усложнять то, что работает и - с непредсказуемым результатом?
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

как-бы для обратной совместимости... у меня например эта функция использовалась без параметров, и изменять лишний раз работающий код не охота :D
а если в Ваших примерах в параметрах поставить вместо пробелов пустые строки? Т.е. все проверки корректности параметров производить не внутри процедуры а перед её вызовом?
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

Понятно. Однако не с того начали - вызов процедуры без параметров даже не компилится - требует параметры.
Что-то не так с overload или я чего не понимаю. Идея доработки в том, чтобы вызывать процедуру как с, так и без параметров?.
Замена пробелов на пустые строки:

Код: Выделить всё

  str_0,str_1:String;
begin
str_0:='     ';  str_1:='     ';
  ODT:=TOdt.Create;
  ODT.LoadTemplate('/arch/shop/template/cennik.odt');
  //ODT.ShowDocument; //ERROR
  // ODT.ShowDocument(str_0,str_1);//ничего не происходит
  //ODT.ShowDocument(str_0,'ddd.odt');/ничего не происходит
 //ODT.ShowDocument('/opt/openoffice.org3/program/swriter','ddd.odt');//работает
 //ODT.ShowDocument('/opt/openoffice.org3/program/swriter',str_0);//открывает док и валится
  Odt.Destroy;
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Ошибка, связанная с перезагрузкой функции устранена - в данном случае не нужна была перезагрузка, достаточно просто параметров по-умолчанию.
Скорректированный модуль здесь
Пишите ваши наблюдения и мысли. Бум допиливать. :!:
Ответить