|
| ||||||||||||
| ||||||||||||
|
2004 г.
Документация на основе RTF-шаблонаАлександр Харьков, "Комиздат" Разработка прикладного ПО - это, как известно, не только написание кода программ, но и проектирование печатных документов и отчетов. Практически все интегрированные среды имеют в своем составе генераторы отчетов, в той или иной степени помогающие решить эту задачу. Однако, несмотря на явные достоинства, использование генераторов отчетов имеет ряд недостатков. Они сводятся, главным образом, к невозможности вносить правки в сформированный документ, а также изменять шаблоны отчета привычными средствами, например обычным текстовым редактором.
До последнего времени самым простым и широко применяемым решением представлялось применение механизма OLE. Например, для комбинации Word и VisualBasic возможна такая схема:
' NumStr - кол-во строк в отчете Dim objWord As Word.Application ' создаем объект Word ' открываем файл шаблона ' заполняем "шапку документа" - номер и получатель ' связывам объект с таблицей ' выделяем 2-ю строку таблицы в шаблоне ' вставляем нужное кол-во строк-1 ' для каждой строки в каждую ячейку вставляем нужные ' проставляем сумму "Всего"
Но эту идиллическую картину омрачает несколько неприятных моментов. Во-первых, недостаточная гибкость приложения - если вы захотите перейти на другой редактор, то придется писать код заново. Во-вторых, приложение работает только в среде пакета MS Office, а он стоит немалых денег. Если приложение должно работать на 30-ти компьютерах предприятия, то установка на них MS Office обойдется примерно в 40 тыс. гривен - не каждый бюджет выдержит.
В то же время существует целый ряд бесплатных и достаточно полнофункциональных офисных пакетов: OpenOffice, StarOffice, EasyOffice и др. Для большинства операций, выполняемых обычно с документами, их возможностей вполне достаточно. Но возможна ли их простая и эффективная интеграция в прикладное программное обеспечение? Решением этой проблемы может быть использование RTF-файлов. Этот формат, предложенный Microsoft как стандарт для обмена данными между текстовыми редакторами, поддерживается абсолютным большинством офисных пакетов. Сама Microsoft использует его в качестве формата, в котором данные передаются через буфер обмена между различными приложениями Windows. Кратко об RTFВ формате RTF используются только коды, представляемые символами из наборов ASCII, MAC и PC. Помимо текста, RTF-файл содержит команды управления в читаемой форме. Документ состоит преимущественно из команд управления настройкой программы чтения. Эти команды можно разделить на управляющие слова и управляющие символы. Управляющее слово представляет собой последовательность символов с разделителем в конце. Например, фрагмент: …\bkmkstart ndoc… соответствует началу закладки ndoc. Перед управляющим словом вводится обратная косая черта (\). В качестве разделителей могут использоваться следующие символы:
Для задания управляющей последовательности в RTF-формате используются буквы от А до Z и от а до z, а также цифры от 0 до 9. Национальные символы к управляющей информации не относятся. В качестве управляющих символов используются отдельные буквы. Перед каждым управляющим символом вводится обратная косая черта (\). Например, фрагмент: …\f1\fs20… устанавливает шрифт № 1 размером в 20 единиц. Фрагмент RTF-файла приведен ниже. Структура его, как можно видеть, напоминает структуру HTML-документа: \intbl\phmrg\posy371\dxfrtext180\dfrmtxtx180\dfrmtxty0\nowrap В RTF-формате существует возможность объединять отдельные последовательности в группы при помощи скобок: {группа} Такие группы создаются, например, при описании сносок, колонтитулов, закладок и т.п. Вот некоторые управляющие слова и символы, имеющие непосредственное отношение к теме нашей статьи:
\'d1\'f2\'f0\'ee\'ea\'e0 ('строка')
Поскольку нас интересуют только определенные задачи, знания приведенных выше управляющих слов и символов вполне достаточно. Условимся для простоты называть управляющие слова и символы тегами. А теперь рассмотрим алгоритмы решения трех основных задач, возникающих при создании документации. Вставка строки на месте закладкиПример такой закладки: …{\*\bkmkstart ndoc}<значение закладки>{\*\bkmkend ndoc}… Для решения данной задачи можно предложить следующий алгоритм.
Алгоритм реализован в виде функции In_Zakl1(pth As String, zakl As String, data As String), где pth - имя RTF-файла, zakl - имя закладки, data - строка для добавления в файл. Добавление строк в таблицуПредположим, нам требуется найти m-ю строку в n-той таблице и повторить ее в этой таблице p раз. Для поиска начала строки таблицы мы будем использовать тег \intbl, а для поиска конца - тег \row. Конец самой таблицы определяется по последовательности тегов \row…\pard…\par. Алгоритм решения этой задачи следующий.
Следует отметить, что недостатком предложенного алгоритма является то, что он может копировать любую строку таблицы, кроме первой. Но в большинстве случаев первая строка является "шапкой" документа и копировать ее нет необходимости. Алгоритм реализован в виде функции In_TStr (pth As String, itbl As Integer, irow As Integer, kol As Integer), где pth - имя RTF-файла, itbl - номер таблицы, irow - номер строки, kol - количество повторов строки. Заполнение ячейки таблицыПредставим, что требуется найти k-ю ячейку в m-й строке n-й таблицы и вставить в нее текстовую строку данных. Пример таких ячеек: ...{\lang1033\cgrid0<содержимое 1-й ячейки> Задача может быть решена по следующему алгоритму.
Данный алгоритм реализован в виде функции In_Tcell1(pth As String, itbl As Integer, irow As Integer, icell As Integer, ndata As String), где pth - имя RTF-файла, itbl - номер таблицы, irow - номер строки, icell - номер ячейки, data - строка для занесения в ячейку. Программа на VisualBasic, демонстрирующая применение такой технологии и функционально идентичная программе, приведенной в начале этой статьи, выглядит так: ' NumStr - кол-во строк в отчете Dim res As Boolean ' результат выполнения функций ' заполняем "шапку документа" - номер и получатель res = In_Zakl1(pth, "ndoc", Str_ndoc) ' вставляем нужное кол-во строк-1 ' для каждой строки в каждую ячейку вставляем For i = 1 To NumStr res = In_Tcell1(pth, 1, NumStr + 2, 5, Itog)
ЗаключениеКаковы преимущества и недостатки предложенной технологии? Начнем с достоинств. Во-первых, это более гибкая технология для формирования отчетов - даже если часть пользователей работает с OpenOffice, а часть с MS Office, программа создания отчетных документов универсальна. Во-вторых, несмотря на многоразовую перезапись файла шаблона во время работы, эта программа работает быстрее, чем связка OLE+Word. Тем более что приведенные выше алгоритмы могут совершенствоваться. Один из примеров кардинального повышения производительности приведен в листингах варианта для PascalDelphi. В-третьих, пользуясь свободным ПО, вы экономите деньги. Теперь о проблемах. Основная из них - это недостаточная стандартизация формата RTF. Производители ПО, в целом придерживаясь единого стандарта, допускают несколько свободную трактовку частных моментов. Результат - проблемы с использованием "чужих" RTF-файлов, подготовленных в других редакторах. Например, MS Word сохраняет графические изображения внутри RTF-файла в виде последовательности шестнадцатеричных кодов, а OOWriter - как внешний файл. Впрочем, эти проблемы решаются - стоит только приложить некоторые усилия. |
|
CITForum © 1997–2025