Работа с uOpenOffice

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

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

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

Сообщение leo_bsv »

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


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

Владислав, разработчик модуля, не против чтобы мы выложили исходник и организовали поддержку.
Вообщем давайте выложим - вопрос - куда? SourceForge или Google Code?
Если у кого-то есть желание и опыт работы с такими ресурсами - милости просим.
Если не найдётся подходящей кондидатуры - это сделаю я :D только чур ногами не пинать - ни разу такими вещами не занимался.

Добавлено спустя 8 часов 9 минут 9 секунд:
Есть мысль дать модулю более независимое название - для последующей публикации на Google Code или SourceForge :) автор не против.
Что думаете по этому поводу? Варианты?
Куда бум выкладывать? Google Code или SourceForge? Что лучше?
frost_asm
новенький
Сообщения: 26
Зарегистрирован: 28.12.2008 21:40:36

Сообщение frost_asm »

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

Сообщение leo_bsv »

frost_asm писал(а):а насчет названия у меня что то совсем нет идей.

может быть назвать его ODF или ODFproc раз он с этими документами работает... :?:
вообще говоря этот формат реализован не только в OOo и Libre...
это ли не очередная реализация Open Document Format :?:
не знаю есть среди паскальных модулей модуль с названием odf.pas или нет... :?:
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

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

На вскидку накидал вот что :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;


Валится на if (Node.FirstChild.NodeName='text:p') and
(UTF8Pos(Prefix,Node.FirstChild.TextContent)>0) then begin

Если возможно, помогите! Сам не разберусь. Спасиб!
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Уместно было бы проверять Node.FirstChild<>nil, перед тем как пытаться прочитать TextContent...
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

Несколько идей по улучшению uOpenOffice

1. В функции TOoWriter.FindAndReplace необходимы изменения. По крайней мере с fpc 2.4.4, а может быть и раньше, TDOMNode.TextContent объявлен как DOMString, а DOMString = WideString. Поэтому происходит перекодировка в WideString из строки в кодировке UTF-8, как из AnsiString.
Что-то вроде :oops:

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

{$IFDEF FPC_VER 2.4.4} // ифдефы нужно переписать на проверку ВЕРСИИ fpc, сейчас не вспомню как :) !!!!
    txtcontent:=UTF8Encode(Node.TextContent);
{$ELSE}
    txtcontent:=Node.TextContent;
{$ENDIF}
    // делаем замену при розвращении по дереву
    if pos(Search,txtcontent)>0 then
        begin
{$IFDEF  FPC_VER 2.4.4}
           node.TextContent := UTF8Decode(ReplaceAllSubString(txtcontent,Search,Replace));
{$ELSE}
           node.TextContent := ReplaceAllSubString(txtcontent,Search,Replace);
{$ENDIF}

2. TTable желательно переименовать в TOoWriterTable или хотя бы TOoTable, чтобы не было путаницы с потомком TDataset.
3. При выполнении TOoWriter.LoadTemplate желательно запоминать весь набор файлов, входящих в шаблон, и при TOoWriter.GenerateDocument их добавлять в новый документ также. Иначе могут исчезнуть вставленные изображения, объекты и т.п.
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Sergei I. Gorelkin писал(а):Уместно было бы проверять Node.FirstChild<>nil, перед тем как пытаться прочитать TextContent...

+1 или Node.HasChildren
2 v-t-l угу :!: ценные рекомендации :!:
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

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

Сообщение leo_bsv »

v-t-l писал(а):1. В функции TOoWriter.FindAndReplace необходимы изменения. По крайней мере с fpc 2.4.4, а может быть и раньше, TDOMNode.TextContent объявлен как DOMString, а DOMString = WideString. Поэтому происходит перекодировка в WideString из строки в кодировке UTF-8, как из AnsiString.

Не ясен мотив такого наворота... при использовании русских идентификаторов и вообще русских символов в исходном тексте я обычно пишу UTF8ToSys('мой_текст') и всё работает,.. а что - что-то не работало? Я вообще говоря не замечал... где искать? :)
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

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

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

Сообщение leo_bsv »

v-t-l писал(а):Писать каждый раз Utf8ToSys несколько не удобно, мне кажется :D

мне тоже так кажется :wink: зато работает всё ))))
создавай аккаунт на SourceForge.net и скажи мне username созданного аккаунта - добавлю тебя в девелоперы.

Добавлено спустя 1 час 39 минут 23 секунды:
Файл модуля доступен из репозитория svn://svn.code.sf.net/p/odfproc/code/trunk,
терминальная команда lin:

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

svn checkout svn://svn.code.sf.net/p/odfproc/code/trunk odfproc-code

страница ODFProc.pas на SF: https://sourceforge.net/p/odfproc/
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

v-t-l писал(а): При выполнении TOoWriter.LoadTemplate желательно запоминать весь набор файлов, входящих в шаблон, и при TOoWriter.GenerateDocument их добавлять в новый документ также. Иначе могут исчезнуть вставленные изображения, объекты и т.п.

Кстати использование внешних архиваторов решает проблему - просто архивируется всё содержимое папки. Как это сделать с помощью zipper пока не знаю.

Добавлено спустя 1 час 58 минут 6 секунд:
Проблема архивации успешно решена с помощью zipper'a )
volodya25
новенький
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Сообщение volodya25 »

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

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

procedure TForm1.Button1Click(Sender: TObject);
var oowriter: todt;
 begin
   OoWriter:=TOdt.Create; 


Получаю ошибку Project project1 raised exception class `EDOError` with message: EDOMError in DOMDocument.CreateAttribute

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

procedure TOdt.GenerateStyles;
var Root, Node: TDOMNode;
begin
FreeAndNil(FStyles);
FStyles:=TXMLDocument.Create;
Root:=FStyles.CreateElement('office:document-styles');
  InsertXMLNS(TDOMElement(Root));  // Здесь появляется сообщение об ошибке


Возможно ошибка из-за того что в файле odfproc.pas изменил строку

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

uses main,Zipper; 

на

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

uses Zipper; 

Модуль main у меня отсутствует.
Поскажите пожалуйста что я делаю не так.
Ubuntu 11.10/Lazarus 0.9.30/FPC 2.4.4
Аватара пользователя
leo_bsv
постоялец
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола
Контактная информация:

Сообщение leo_bsv »

Косяк появился после внесения изменений, исправляю... main никак не влияет.

Добавлено спустя 12 минут 19 секунд:
Ошибка устранена.
Модуль не тестировался, об ошибках можете сообщать сюда или на страницу на SourceForge
Теоритически сейчас всё доложно работать :)
volodya25
новенький
Сообщения: 10
Зарегистрирован: 03.11.2011 22:33:23
Откуда: Украина

Сообщение volodya25 »

Заработало.
TZipper на выходе формирует .zip а не .odt, из-за чего Writer потом не находит сформированный файл. Вылечил.
Если используется Libre Office то запуск редактора не через ooffice а через soffice.
Куда слать патч?
Ответить