Работа с uOpenOffice

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

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

Re: Работа с uOpenOffice

Сообщение v-t-l » 16.01.2012 16:29:23

Но стоит только "Сохранить как..." под другое имя файла, и документ становится редактируемым!
v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Работа с uOpenOffice

Сообщение Владимир » 16.01.2012 21:12:47

v-t-l писал(а):Re: Работа с uOpenOffice
Непрочитанное сообщение v-t-l » 16.01.2012 15:29:23
Но стоит только "Сохранить как..." под другое имя файла, и документ становится редактируемым!

Согласен, конечно. Но в моем случае пользователь априори знает, что оригинальные данные уже ушли в офис, так что сохранять под другим именем, редактировать и распечатывать документ бесполезно!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Работа с uOpenOffice

Сообщение leo_bsv » 04.02.2012 00:22:33

22 ревизия
TPositiveInteger подобные типы решено описывать как объекты (чтобы не создавать и не уничтожать каждый раз) + проверка на соответствие этим логическим типам декларированным в OASIS будет включена в эти самые типы, чтобы не писать к кажому свойству процедуру Set...
Последний раз редактировалось leo_bsv 05.02.2012 23:25:26, всего редактировалось 1 раз.
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Работа с uOpenOffice

Сообщение leo_bsv » 05.02.2012 00:54:24

23 ревизия

Добавлено спустя 22 часа 29 минут 50 секунд:
24 ревизия
Наконец-то добрались до ширины колонок - теперь можно корректировать ширину колонок!
Вот кусок моего тестового кода:
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var ODT: tOdt;
    T: TOdtTable;
    i:integer;
    TableWidth, NewColWidth: TLength;
begin
   ODT:=TOdt.Create;
   ODT.LoadTemplate(FNE.Text);
   // Настроим свойства таблицы
   T:=ODT.GetTable('Таблица1');
   TableWidth:=T.Properties.Width;
   // ставлю ширину первой колонки в 5 см
   // остальные колонки - одинаковые
   NewColWidth.Value:=(TableWidth.Value-5.0)/(T.ColCount-1);
   NewColWidth.Measure:=TableWidth.Measure;
   for i:=0 to T.ColsProperties.Count-1 do begin
     if i=0 then begin
       T.ColsProperties[i].Width.Value:=5.0;
     end
     else T.ColsProperties[i].Width:=NewColWidth;
   end;
   T.SetColsProperties;
   T.SetColumns;
   ODT.ShowDocument;
   ODT.Destroy;


Всем интересующимся предлагается протестировать и высказать мысли...

Добавлено спустя 13 часов 50 минут 16 секунд:
При тестировании выяснилось - атрибут колонок style:use-optimal-column-width, описанный в спецификации не реализован в OOo 3.2 и LibreOffice 3.4.5, поэтому соответствующее свойство TOdtTableLineProperties - UseOptimalSize будет отключено до лучших времён, функционал реализован и закомментирован. Указанные программы позволяют автоматически оптимизировать таблицу и колонки в ней по ширине только через интерфейс, при этом в файл записываются лишь абсолютные значения ширины. К сожалению, это свидетельствует о том что мы не имеет возможности использовать обработчики офисных пакетов с целью оптимизации таблиц. Остаётся только пересчитывать их размеры "вручную"...

Атрибуты колонок fo:break-after и fo:break-before тоже не функционируют... код отвечающий за их включение в хмл будет закомментирован

Добавлено спустя 1 час 16 минут 6 секунд:
Атрибут стиля колонки style:rel-width также не даёт результатов при использовании, соответствующее свойство было отключено (закомментировано), а также все методы связанные с ним.

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

Добавлено спустя 13 минут 48 секунд:
25 ревизия

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

Re: Работа с uOpenOffice

Сообщение Arkano » 05.04.2012 21:42:06

Народ... безуспешно бьюсь при попытке подружить lazarus s OO
Взял 26 ревизию, подключил к новому проекту, в котором 1 кнопка и скопипастил выше расположенный кусок кода.
Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var ODT: tOdt;
    T: TOdtTable;
    i:integer;
    TableWidth, NewColWidth: TLength;
begin
   ODT:=TOdt.Create;
   ODT.LoadTemplate(FNE.Text);
   // Настроим свойства таблицы
   T:=ODT.GetTable('Таблица1');
   TableWidth:=T.Properties.Width;
   // ставлю ширину первой колонки в 5 см
   // остальные колонки - одинаковые
   NewColWidth.Value:=(TableWidth.Value-5.0)/(T.ColCount-1);
   NewColWidth.Measure:=TableWidth.Measure;
   for i:=0 to T.ColsProperties.Count-1 do begin
     if i=0 then begin
       T.ColsProperties[i].Width.Value:=5.0;
     end
     else T.ColsProperties[i].Width:=NewColWidth;
   end;
   T.SetColsProperties;
   T.SetColumns;
   ODT.ShowDocument;
   ODT.Destroy;


Крутил и так и эдак... прет такая ошибка:
odfproc.pas(756,15) Error: Forward declaration not solved "TOdt.ShowDocument(AnsiString="xdg-open",AnsiString="doc.odt");"

Дело в том, что ранее юзал делфи и модуль uOpenOffice, там у меня все пашет отлично, но на лазаре этот модуль (как я понял) не катит... :( Лазарь скачал буквально на днях и все эти 2-3 дня бьюсь в попытках запустить тупой project "Hello, World!"
Может кто поделится рабочим проектом с уже подключенным модулем и минимум необходимого для создания *.odt и генерирования минималистического контента.

Добавлено спустя 2 часа 43 минуты 20 секунд:
Хм... подсказали забавное решение: http://www.cyberforum.ru/lazarus/thread332812.html
Через тьмутаракань, но млин работает же... главное, что все функции можно самому осилить (мне это проще, чем в xml разбираться). Я тоже далеко не программист как и автор данного решения. Правда печалит, что по уму сделать все-таки не получается... Или данное решение все-таки имеет право на существование?
Arkano
новенький
 
Сообщения: 10
Зарегистрирован: 05.04.2012 10:24:02

Re: Работа с uOpenOffice

Сообщение leo_bsv » 13.04.2012 12:43:11

Arkano писал(а):odfproc.pas(756,15) Error: Forward declaration not solved "TOdt.ShowDocument(AnsiString="xdg-open",AnsiString="doc.odt");"

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

Re: Работа с uOpenOffice

Сообщение v-t-l » 13.04.2012 13:32:55

v-t-l
энтузиаст
 
Сообщения: 733
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Работа с uOpenOffice

Сообщение Владимир » 13.04.2012 22:58:40

Может кто поделится рабочим проектом с уже подключенным модулем и минимум необходимого для создания *.odt и генерирования минималистического контента.
Код: Выделить всё
procedure TMainFrm.BitOkPrinterOClick(Sender: TObject);
var
i,k:Integer;
sum,sum_all,sum_st,s_qty,s_qty_st:Double;
Table:TODTTable;
begin
  PanPrinterO.Visible:=False;
   if PanPrinterO.Tag=1 then BEgin//
   if CheckFRFO.Checked=False then Begin
       if GridOstat.Cells[0,1]<>'' then begin
  Odt:=TOdt.Create;
  if Odt.LoadTemplate('/arch/shop/template/invent.odt') then begin
  Odt.FindAndReplace('firm',sh_head);
  Odt.FindAndReplace('sh_num',UTF8ToSys(LabShiftNum.Caption));
  Odt.FindAndReplace('curdatetime',UTF8ToSys(LabD_beg.Caption));
  Odt.FindAndReplace('suminvent',suminvent);
  Odt.FindAndReplace('factor',suminvent_n);
  Table:=Odt.GetTable('Таблица1');
  sum:=0;sum_all:=0;
  k:=1;
  for i:=1 to GridOstat.RowCount-1 do begin
    if  (Trim(GridOstat.Cells[2,i])<> Trim(GridOstat.Cells[4,i]))then begin
  Table.MultiplyRow(k,1);//добавили строку
  Table.Cell[0,k]:=GridOstat.Cells[0,i];
  Table.Cell[1,k]:=Utf8ToSys(GridOstat.Cells[1,i]);
  Table.Cell[2,k]:=GridOstat.Cells[2,i];
  Table.Cell[3,k]:=GridOstat.Cells[3,i];
  Table.Cell[4,k]:=GridOstat.Cells[4,i]
  sum:=(StrToFloat(GridOstat.Cells[4,i])-StrToFloat(GridOstat.Cells[2,i]))*StrToFloat(GridOstat.Cells[3,i]);
  sum_all:=sum_all+sum;
    if Trim(GridOstat.Cells[7,i])<>'' then Table.Cell[1,k]:=Table.Cell[1,k]+'   (я│п╨п╩п╟п╢)';
   k:=k+1;
   end;//if
  end;//for
  Table.Cell[1,k]:='п≤п╥п╠я▀я┌п╬п╨/п╫п╣п╢п╬я│я┌п╟я┤п╟ '+Format('%.2f',[sum_all])+' я─я┐п╠';

  Odt.ShowDocument(UnMark.Path_oowrite,'п╦п╫п╡п╣п╫я┌п╟я─п╦п╥п╟я├п╦я▐');
  end else ShowMessage('п²п╣ п╫п╟п╧п╢п╣п╫ я┬п╟п╠п╩п╬п╫');//п╣я│п╩п╦  я┐я│п©п╣я┬п╫п╬ п╥п╟пЁя─я┐п╥п╦п╩п╦ я┬п╟п╠п╩п╬п╫
  Odt.Destroy;
    end;//<>''
  End else PrintInventFR;
PanPrinterO.Tag:=0;//
PanOst.Visible:=False;
GridOstat.RowCount:=2;
OnMenu;
ENd else BEgin
  if CheckFRFO.Checked=False then Begin
    if flCheck=False then begin
    if GridOstat.Cells[0,1]<>'' then begin
  Odt:=TOdt.Create;
  if Odt.LoadTemplate('/arch/shop/template/ostatki.odt') then begin
  Odt.FindAndReplace('firm',sh_head);
  Odt.FindAndReplace('grp',UTF8ToSys(ComboGrpOst.Text)+' ('+Utf8ToSys(PanOst.Caption)+')'); //п╢п╬п╠п╟п╡п╩я▐я▌ п╨п╟я┌п╣пЁп╬я─п╦я▌
  Odt.FindAndReplace('curdatetime',DateToStr(date)+' '+TimeToStr(time));
  Table:=Odt.GetTable('п╒п╟п╠п╩п╦я├п╟1');
  sum_all:=0;s_qty:=0;s_qty_st:=0;sum_st:=0;
  for i:=1 to GridOstat.RowCount-1 do begin
  Table.MultiplyRow(i,1);//п╢п╬п╠п╟п╡п╦п╩п╦ я│я┌я─п╬п╨я┐ ARow,count
  Table.Cell[0,i]:=GridOstat.Cells[0,i];//п╟я─я┌п╦п╨
  Table.Cell[1,i]:=Utf8ToSys(GridOstat.Cells[1,i]);//п╦п╪я▐
  Table.Cell[2,i]:=GridOstat.Cells[2,i];//п╨п╬п╩-п╡п╬
  s_qty:=s_qty+StrToFloat(GridOstat.Cells[2,i]);
  Table.Cell[3,i]:=GridOstat.Cells[3,i];//я├п╣п╫п╟
  sum:=StrToFloat(GridOstat.Cells[2,i])*StrToFloat(GridOstat.Cells[3,i]);
  Table.Cell[4,i]:=Format('%.2f',[sum]);//я│я┐п╪п╪п╟
  sum_all:=sum_all+sum;
   if GridOstat.Cells[4,i]<>'' then begin
   Table.Cell[1,i]:=Table.Cell[1,i]+'   (я│п╨п╩п╟п╢)';
   s_qty_st:=s_qty_st+StrToFloat(GridOstat.Cells[2,i]);
   sum_st:=sum_st+sum;
    end;//п╣я│п╩п╦ я│п╨п╩п╟п╢
   end;//for
  Table.Cell[0,i+1]:='п▓я│п╣пЁп╬';
  Table.Cell[2,i+1]:=FloatToStr(s_qty);//п╬п╠я┴.п╨п╬п╩-п╡п╬
  Table.Cell[4,i+1]:=Format('%.2f',[sum_all]);//я│я┐п╪п╪п╟
    if s_qty_st>0 then begin
  Table.Cell[2,i+1]:=FloatToStr(s_qty)+ ' п╡ я┌.я┤. п╫п╟ я│п╨п╩п╟п╢п╣ '+FloatToStr(s_qty_st);
  Table.Cell[4,i+1]:=Format('%.2f',[sum_all])+ ' п╡ я┌.я┤. п╫п╟ я│п╨п╩п╟п╢п╣ '+Format('%.2f',[sum_st]);
   end;//>0

  Odt.ShowDocument(UnMark.Path_oowrite,'п╬я│я┌п╟я┌п╨п╦');
  end else ShowMessage('п²п╣ п╫п╟п╧п╢п╣п╫ я┬п╟п╠п╩п╬п╫');//п╣я│п╩п╦  я┐я│п©п╣я┬п╫п╬ п╥п╟пЁя─я┐п╥п╦п╩п╦ я┬п╟п╠п╩п╬п╫
  Odt.Destroy;
    end;//<>''
   end else begin;//flCheck=flase
   if GridOstat.Cells[0,1]<>'' then begin
  Odt:=TOdt.Create;
  if Odt.LoadTemplate('/arch/shop/template/stockcheck.odt') then begin
  Odt.FindAndReplace('firm',sh_head);
  Odt.FindAndReplace('grp',UTF8ToSys(ComboGrpOst.Text));
  Odt.FindAndReplace('curdatetime',DateToStr(date)+' '+TimeToStr(time));
  Table:=Odt.GetTable('Таблица1');
    for i:=1 to GridOstat.RowCount-1 do begin
   if i< GridOstat.RowCount-1 then
  Table.MultiplyRow(i,1);
  Table.Cell[0,i]:=GridOstat.Cells[0,i];
  Table.Cell[1,i]:=Utf8ToSys(GridOstat.Cells[1,i]);
  Table.Cell[2,i]:=GridOstat.Cells[2,i];//п╨п╬п╩-п╡п╬
  Table.Cell[3,i]:=GridOstat.Cells[5,i];//п©я─п╦я┘п╬п╢
  Table.Cell[4,i]:=GridOstat.Cells[3,i];//я├п╣п╫п╟
  Table.Cell[5,i]:=GridOstat.Cells[6,i];//п©я─п╬п╢п╟п╤п╟
  sum:=StrToFloat(GridOstat.Cells[2,i])+StrToFloat(GridOstat.Cells[6,i])-StrToFloat(GridOstat.Cells[5,i]);
  Table.Cell[6,i]:=FloatToStr(sum);//п╬я│я┌п╟я┌п╨п╦+п©я─п╬п╢п╟п╤п╟-п©я─п╦я┘п╬п╢
    end;//for
  Odt.ShowDocument(UnMark.Path_oowrite,'проверка');
  end else ShowMessage('не найден шаблон');//
  Odt.Destroy;
    end;//<>''
    end;//flCheck=True
   End else PrintOstFr;//п©п╣я┤п╟я┌п╟п╣п╪ п╬я│я┌п╟я┌п╨п╦ п╦п╩п╦ п©я─п╬п╡п╣я─п╨я┐ я│п╨п╩п╟п╢п╟ п╫п╟ п╓п═
   ActiveControl:=GridOstat;
ENd;
end;               

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

Re: Работа с uOpenOffice

Сообщение leo_bsv » 14.04.2012 01:28:15

v-t-l писал(а):http://freepascal.ru/forum/viewtopic.php?f=24&t=7297&start=45#p57544


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

Re: Работа с uOpenOffice

Сообщение Brainenjii » 26.05.2012 11:48:39

попробовал модуль - шикарно! Несколько вопросов:
  • Возможно ли разделить код на зависимые и независимые от X части? Вернее, не будете ли против патча? ^_^
  • Возможно ли объединять ячейчи в таблице?
  • Возможно ли вставить колонтитулы/картинки?
  • Возможно ли получить число страниц для сгенерированного документа? Получить номер текущей страницы?
Спасибо!
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Работа с uOpenOffice

Сообщение leo_bsv » 04.06.2012 22:15:31

Brainenjii писал(а):Возможно ли разделить код на зависимые и независимые от X части? Вернее, не будете ли против патча? ^_^

... э... поясните суть идеи, не совсем понял. :)
Brainenjii писал(а):Возможно ли объединять ячейчи в таблице?

по-моему последнее что было полноценно реализовано - работа с колонками, работа с ячейками - очень объёмная часть, начато описание типов, функционал не реализован
Brainenjii писал(а):Возможно ли вставить колонтитулы/картинки?

код реализующий правку/вставку колонтитулов и картинок не реализован
если задаться целью - можно дописать, все подробности есть в спецификации по ODF
Brainenjii писал(а):Возможно ли получить число страниц для сгенерированного документа? Получить номер текущей страницы?

опять же - не реализовано.

так то конечно не плохо бы всё это поиметь :) но к сожалению нет свободного времени на то чтобы вплотную заниматься... если допишите - будет очень хорошо!

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

Re: Работа с uOpenOffice

Сообщение Brainenjii » 05.06.2012 11:38:04

Как оказалось, колонтитулы, номера страниц и т.п. легко решаются шаблоном. Объединение ячеек реализовать удалось довольно-таки легко. Другое дело, что лазарус у меня зависал в попытках вывести лог от heaptrc'а.. Так что не смог сдержаться и начал преодолевать фатальный недостаток Изображение
http://pastebin.com/5sQmiDkn
Под Windows, как водится, не тестировал ^_^
Основная задача - отвязать от LCL, зависимостей от иксовых либ и устранение утечек памяти.

UPD: для преобразования в html использую xsltproc. Поскольку политика вложений на форуме завораживает - стили и xlstproc под Windows (у меня вызвало некоторые затруднения его найти) - на ifolder'e - http://ifolder.ru/30932894
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Работа с uOpenOffice

Сообщение leo_bsv » 05.06.2012 22:30:49

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

Re: Работа с uOpenOffice

Сообщение Brainenjii » 05.06.2012 22:41:53

Только за ^_^ Правда лицензия LGPL (не модифицированная, в отличии от LCL и FCL) радовать не будет ^_^ Насчет оригинала - лицензия указана LGPL - там, случайно, не забыто modified? :roll:
Задача именно такая - в OOo создается шаблон, затем на сервере из него плодятся заполненные документы. Поскольку я сейчас в основном пытаюсь перенести GUI в браузер - фишечка "предпросмотра" отчета в HTML радует несказанно ^_^
По планам: воздание документа/таблиц прями из кода считаю излишним. В ближайших мечтах - добавить возможность построения Master/Detail и Cross отчетов... В мечтах чуть отдалённей - связывание таблиц и каких-нибудь DataSet'ов...
ИМХО, может получиться даже вкуснее, чем LazReport ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Работа с uOpenOffice

Сообщение leo_bsv » 05.06.2012 22:51:35

Brainenjii писал(а):ИМХО, может получится даже вкуснее, чем LazReport ^_^

+1, в своё время LazReport меня тоже не обрадовал, пришлось заниматься такими поделками... :)
по поводу LGPL и modified - второе вероятно забыто, не до этого было... думается что возможность дополнить может быть оговорена с автором Владиславом Баженовым, он в принципе не заморачивался сильно по поводу лицензирования когда я у него интересовался... я не против использования модуля, а также кода (точнее внесённой мною части кода), в коммерческих целях... =)
приставка modified подразумевает что лицензия модифицирована в сторону... того что на основе ODFProc модуля можно стряпать не только свободные, но и откровенно коммерческие поделия?

Добавлено спустя 1 минуту 27 секунд:
Brainenjii, а вы готовы предоставить modified LGPL на свой remake? :D
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Пред.След.

Вернуться в Office Lib

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

Рейтинг@Mail.ru