Вот и подоспела ещё одна доработка модуля uOpenOffice.pas — модуля для работы с таблицами OpenOffice. Сегодняшнему обновлению модуля мы должны быть благодарны читателю Буркову Сергею aka Leo. Несмотря на то, что его сайт не имеет отношения к Delphi, я все-таки оставил ссылку, как благодарность читателю за то, что не забыл поделиться со всеми своими разработками. Ну, а теперь к делу.
Во-первых, следует сделать небольшое замечание по поводу работы модуля в целом.
Модуль при загрузке шаблона создаёт папку template, распаковывает в неё документ .odt, производит изменения, а после генерации документа стирает эту папку при закрытии OOWriter (но
не при закрытии документа), документ может быть сохранён
стандартными средствами OpenOffice, однако папка template со всеми временными файлами, в том числе и со сгенерированным документом УДАЛЯЕТСЯ после закрытия OO Writer. Если эта папка используется программой для каких-то других целей — её удаление может быть опасным -риск потери данных. Файл шаблона лежит в папке с exe-шником, возможно имеет смысл дать пользователю возможность указать произвольный путь.
Дело в том, что ни мне, ни Сергею подобные возможности модуля были не нужны. Да у меня и не было надежды на то, что модуль буде пользоваться спросом у Вас. Так что, если решите доработать эту часть модуля — все в ваших руках :).
Что касается доработанных частей модуля, то Сергей внес следующие коррективы:
1. Написал процедуру MultiplyRow для работы с таблицей (копирования нужной строки вместе с идентификаторами для замены)
2. Добавил процедуру FindAndReplace для класса TTable (для подстановок в строках)
3. Вынес GetTable в public для подключения таблицы по имени (имя таблицы можно узнать в её свойствах в ОО)
4. Добавил функцию LoadTemplate позволяющую более просто загружать шаблон
5. Добавил ShowDocument для быстрого отображения.
Также Leo поделился с нами небольшим примером использования модуля в своей программе. Вот он:
// Создадим файл 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;
Кстати, ещё одно очень важное замечание: Сергей дорабатывал модуль для работы в именно в Linux и на кроссплатформенности в целом не заострял внимания. Хотя я думаю, что модуль без проблем выполнит свою работу и в Lazarus под Windows.
Думаю, что можно было бы вынести разработку модуля в отдельный проект на том же Google Code, но боюсь, что третий проект я уже в полной мере контролировать не смогу :).
Буду благодарен, если Вы продолжите делиться со мной новыми версиями и доработками модуля.
А вот и сам модуль uOpenOffice.pas:
[download id=»48″ format=»1″]
Немного не понимаю. В самом нечале модуля строчка:
Win32_Cmd =’C:/Windows/System32/cmd.exe’;
но ведь OS не всегда устанавливается в папку по умолчанию. А вот как использовать вместо ‘C:/Windows/’ переменную среды ‘%windir%’ не соображу.
[…] =) И спустя некоторое время Бурков Сергей aka Leo дважды вносил изменения в модуль и улучшал его […]