Работа с uOpenOffice

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

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

Re: Работа с uOpenOffice

Сообщение Владимир » 15.10.2011 21:52:13

leo_bsv писал(а):Использую uOpenOffice для формирования таблиц во Writer... пишу на Lazarus всё работает, сам дописывал функционал под свои нужды, кстати

Согласен полностью!
Вопрос
Код: Выделить всё
procedure TOoXmlWriter.InsertXMLNS(var RootNode: TDOMElement);
var i: integer;
begin   
  for i := 1 to High(xmlnscalc) do
    RootNode.SetAttribute('xmlns' + xmlnscalc[i, 1], xmlnscalc[i, 2]);
end;

При компиляции пишет identifer not found "xmlnscalc"
У меня Xfce + LibreOffice - делать что-то или наплевать? Стремно как-то.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Работа с uOpenOffice

Сообщение leo_bsv » 15.10.2011 23:19:37

вообще у меня в модуле есть только процедура
Код: Выделить всё
procedure TOoWriter.InsertXMLNS(var RootNode: TDOMElement);
var i:integer;
begin
  for i:=1 to High(xmlns) do
    RootNode.SetAttribute('xmlns:'+xmlns[i,1],xmlns[i,2]);
end;

а типа TOoXmlWriter даже не определено...
а сам массив xmlns определён так:
Код: Выделить всё
  xmlns: array [1..20,1..2] of string =(('office','urn:oasis:names:tc:opendocument:xmlns:office:1.0'),
                                        ('style' ,'urn:oasis:names:tc:opendocument:xmlns:style:1.0'),
                                        ('text'  ,'urn:oasis:names:tc:opendocument:xmlns:text:1.0'),
                                        ('table' ,'urn:oasis:names:tc:opendocument:xmlns:table:1.0'),
                                        ('draw'  ,'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0'),
                                        ('fo'    ,'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0'),
                                        ('meta'  ,'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'),
                                        ('number','urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0'),
                                        ('svg'   ,'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0'),
                                        ('chart' ,'urn:oasis:names:tc:opendocument:xmlns:chart:1.0'),
                                        ('dr3d'  ,'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0'),
                                        ('form'  ,'urn:oasis:names:tc:opendocument:xmlns:form:1.0'),
                                        ('script','urn:oasis:names:tc:opendocument:xmlns:script:1.0'),
                                        ('of'    ,'urn:oasis:names:tc:opendocument:xmlns:of:1.2'),
                                        ('field' ,'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0'),
                                        ('formx' ,'urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0'),
                                        ('dc'    ,'http://purl.org/dc/elements/1.1/'),
                                        ('xlink' ,'http://www.w3.org/1999/xlink'),
                                        ('math'  ,'http://www.w3.org/1998/Math/MathML'),
                                        ('xforms','http://www.w3.org/2002/xforms'));

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

Re: Работа с uOpenOffice

Сообщение Владимир » 17.10.2011 21:25:55

leo_bsv писал(а):вообще у меня в модуле есть только процедура
видимо у вас там с определением xmlnscalc что-то не ладно...

Все Ок, разобрался, работает.
Но. В таблицы все вставляется как надо, однако после OoWriter.ShowDocument выдается ошибка OpenOffice "Документ поврежден. Бла-бла-бла. Начать восстановление?". После Ок документ восстанавливается и читается нормально. Куда копать?
Спасибо.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Работа с uOpenOffice

Сообщение leo_bsv » 17.10.2011 21:49:15

копать в сторону формата документа...
скорее всего док был некорректно сохранён (а возможно сам формат как-то изменился), попробуйте скопировать док до восстановления, затем восстановить и сопоставить две полученные копии (не восстановленный и восстановленный) на предмет различий в xml... возможно модуль уже требует обновления... возможно шаблон... возможно внесённые вами изменения противоречат внутреннему формату документа OOo... короче, вероятнее всего что док получается невалидный. :D

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

Re: Работа с uOpenOffice

Сообщение Владимир » 17.10.2011 22:38:44

leo_bsv писал(а):копать в сторону формата документа...

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

Re: Работа с uOpenOffice

Сообщение leo_bsv » 18.10.2011 10:26:02

И по-моему подобная история уже была:
http://www.webdelphi.ru/2010/06/obnovlenie-modulya-dlya-raboty-s-openoffice/#more-3678

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

Re: Работа с uOpenOffice

Сообщение frost_asm » 18.10.2011 19:24:25

leo_bsv может стоит выложить актуальную версию модуля, а то та что на webdelphi.ru датируется 9.06.2010.
frost_asm
новенький
 
Сообщения: 26
Зарегистрирован: 28.12.2008 22:40:36

Re: Работа с uOpenOffice

Сообщение leo_bsv » 18.10.2011 20:47:38

По этой ссылке такой же модуль как у меня http://ourfiles.ifolder.ru/18093365...
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Работа с uOpenOffice

Сообщение frost_asm » 21.10.2011 00:38:47

Я думал с того времени может что переписали или добавили)).
Я немного поправил что мне не понравилось, может кому-то пригодиться

1) При замене(FindAndReplace) падало приложение, поскольку замена проводилась без учета того, что при замене могли уничтожаться узлы которые еще оставались в списке, который формировался еще до начала замены.
Плюс поиск не заменял текст в сложно форматированных документах. Теперь заменяет всегда и везде :twisted:

2) Переписал функции загрузки и создания документа с помощью модуля zipper, вместо вызова внешних архиваторов. Разархивирование файлы сохраняются не в папке документа а в папке temp.

http://dl.dropbox.com/u/15324286/uopenoffice.pas
http://dl.dropbox.com/u/15324286/uopenoffice.patch
frost_asm
новенький
 
Сообщения: 26
Зарегистрирован: 28.12.2008 22:40:36

Re: Работа с uOpenOffice

Сообщение leo_bsv » 21.10.2011 20:34:42

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

Re: Работа с uOpenOffice

Сообщение Владимир » 23.10.2011 13:18:32

leo_bsv писал(а):по-поводу FindAndReplace - падения не наблюдал, просто форматирование моих документов видимо не такое сложное )
frost_asm писал(а):Я думал с того времени может что переписали или добавили)).
Я немного поправил что мне не понравилось, может кому-то пригодиться

Спасибо, отдельное спасибо frost_asm-у.
В старой версии (у меня LibreOffice) документ получался битый и требовал восстановления. Начал разбираться, а тут и обновление приспело от frost! Работает все замечательно!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Работа с uOpenOffice

Сообщение frost_asm » 23.10.2011 14:09:38

LibreOffice считал файл битым поскольку при распаковке не обрабатывался файл settings.xml.

leo_bsv писал(а):может быть как-то централизовать это дело?.. я специально отправлял изменения на webdelphi.ru

Может ти бы выложил код на SourceForge или Google Code.
frost_asm
новенький
 
Сообщения: 26
Зарегистрирован: 28.12.2008 22:40:36

Re: Работа с uOpenOffice

Сообщение Владимир » 23.10.2011 19:27:15

frost_asm писал(а):LibreOffice считал файл битым поскольку при распаковке не обрабатывался файл settings.xml.

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

Re: Работа с uOpenOffice

Сообщение leo_bsv » 23.10.2011 20:19:14

frost_asm писал(а):Может ти бы выложил код на SourceForge или Google Code.

Эмм... модуль то не я писал... ) товарищч с webdelphi.ru... напишу ему письмецо =)

Добавлено спустя 1 час 47 минут 10 секунд:
Владимир писал(а):Понятно, спасиб! А вот можно обнаглеть и спросить, как бы удалять не последнюю строку в таблице, а любую, например, по содержимому ячейки? Народу бы было полезно. Поясню: делаем шаблон с избыточным кол-вом строк в таблице, в ячейках - некие имена для замены. После FindAndReplace строки с неизмененными именами в ячейках удаляем - получаем красивый документ.


На вскидку накидал вот что :idea:
Код: Выделить всё
// удаление пустых строк из таблицы
procedure TTable.RemoveEmptyRow(Prefix: string);
var Node, SuicideNode: TDOMNode;
begin
  Node:=RootNode.FirstChild;
  while Assigned(Node) do begin
    //обработаем объединенные ячейки
    if Node.NodeName='table:covered-table-cell' then begin
      Node:=Node.NextSibling;
      continue;
    end;
    if (Node.FirstChild.NodeName='text:p') and
      (UTF8Pos(Prefix,Node.FirstChild.TextContent)>0) then begin
      SuicideNode:=Node;
      Node:=Node.NextSibling;
      SuicideNode.Destroy;
    end;
  end;
end;


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

Re: Работа с uOpenOffice

Сообщение Владимир » 24.10.2011 15:08:32

На вскидку накидал вот что :idea:
Код не тестировался - не использовать на работаеющем приложении без предварительного тестирования :!:

Спасибо, но валится сразу (даже без вызова новой процедуры), если чего-то пытаться сделать (например, FindAndReplace). Если ничего не делать - показывает исходный шаблон.
Может, где-то еще ее (новую процедуру) объявить? Хотя вроде в секции Public TTable - достаточно.
Дополнение: если не вызывать RemoveEmptyRow, то срабатывает через раз с сообщением об отсутствии результирующего файла doc.odt.
Если вызывать - то Acces Violation...
Последний раз редактировалось Владимир 24.10.2011 20:06:42, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Пред.След.

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

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

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

Рейтинг@Mail.ru