Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 21 апреля 2010 в 13:16.
Категории: Основы Delphi.


Вот и подоспела ещё одна доработка модуля 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:
zip uOpenOffice.pas(10.49 KB)

---------------------------
Мини-обзор железа. Сети
Все мы уже давным-давно привыкли к тому, что дома у нас есть Интернет, на работе корпоративная сеть, на даче беспроводной Интернет и т.д. Мы окружены Сетью со всех сторон. Однако, системные администраторы должны представлять себе как работают эти Сети, из каких подсистем состоит, например, СКС и, самое главное для руководителей - во что обходится организации монтаж скс цены на оборудование и т.д. Если Вас также интересуют ти вопросы, то обязательно посетите сайт ВСервере.ру, кроме цен там Вы найдете исчерпыващую информацию по СКС, беспроводным сетям WiFi и т.д.
---------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (2)

WP_Cloudy
  • Wolfenstain пишет:

    Немного не понимаю. В самом нечале модуля строчка:
    Win32_Cmd =’C:/Windows/System32/cmd.exe’;
    но ведь OS не всегда устанавливается в папку по умолчанию. А вот как использовать вместо ‘C:/Windows/’ переменную среды ‘%windir%’ не соображу.

  • SeregaAltmer пишет:
    uses
      SHFolder;
    var
     path: array [0 .. MAX_PATH] of char;
     Win32_Cmd: string;
    begin
     SUCCEEDED(SHGetFolderPath(0, CSIDL_SYSTEM, 0, 0, @path[0]));
     Win32_Cmd := path + '\cmd.exe';
    end;

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник

   


Такая мебель, как кресла и диваны традиционно продается вместе, например в мебельном магазине.