ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Документація на основі RTF-шаблону
         

     

    Інформатика, програмування

    Документація на основі RTF-шаблону

    Олександр Харків, "Комиздат"

    Розробка прикладного ПЗ - це, як відомо, не лише написання коду програм, а й проектування друкованих документів і звітів. Практично всі інтегровані середовища мають у своєму складі генератори звітів, у тому або іншому ступені допомагають вирішити це завдання. Однак, незважаючи на явні переваги, використання генераторів звітів має ряд недоліків. Вони зводяться, головним чином, до неможливості вносити правки в сформований документ, а також змінювати шаблони звіту звичними засобами, наприклад звичайним текстовим редактором.

    До останнього часу найпростішим і широко застосовуваним рішенням представлялося застосування механізму OLE. Наприклад, для комбінації Word і VisualBasic можлива така схема:

    Створюємо якийсь файл - шаблон документа. Там, де має бути "шапка" (дата, номер документа тощо), використовуємо закладки, а для основної частини звіту створюємо таблицю-заготовку відповідної структури. Приклад такого шаблону наведено на рис. 1.

    Пишемо програму з використанням об'єктної моделі Word:

    'NumStr - кількість рядків у звіті

    ' NewData (5, NumStr) - масив з даними для заповнення

    ' таблиці, заздалегідь приведеними до символьному увазі

    ' Itog - сума, приведена до символьному увазі

    ' Pth - шлях до вихідного файлу

    'Str_ndoc = "BS190"

    'Str_name = "Петров І.І."

    .................

    Dim objWord As Word.Application

    Dim objDoc As Word.Document

    Dim objTable As Word.Table

    'створюємо об'єкт Word

    Set objWord = New Word.Application

    ' робимо його видимим - це не обов'язково,

    ' але дуже цікаво:)

    objWord.Visible = True

    ' відкриваємо файл шаблону

    Set objDoc = objWord.Documents.Open (Pth)

    ' робимо його активним

    objDoc.Activate

    ' заповнюємо "шапку документа" - номер і одержувач

    ' - Закладки 'ndoc' і 'name' відповідно

    objDoc.Bookmarks ( "ndoc"). Range.Text = Str_ndoc

    objDoc.Bookmarks ( "name"). Range.Text = Str_name

    'пов'язуючи об'єкт з таблицею

    Set objTable = objWord.ActiveDocument.Tables (1)

    ' виділяємо 2-й рядок таблиці в шаблоні

    objTable.Cell (2, 1). Range.Select

    ' вставляємо потрібну кількість рядків-1

    ' (тому що одна вже є в шаблоні)

    If NumStr> 0 Then objWord.Selection.InsertRows (NumStr - 1)

    'для кожного рядка в кожну клітинку вставляємо потрібні

    'дані з масиву

    For i = 1 To NumStr

    For j = 1 To 5

    objTable.Cell (i + 1, j). Range.Text = NewData (j, i)

    Next j

    Next i

    ' проставляємо суму "Усього"

    objTable.Cell (NumStr + 2, 5). Range.Text = Itog

    Запускаємо її в складі всього програми і отримуємо результат (див. рис. 2).

    Користувач, отримавши звіт у вигляді doc-файлу, може легко внести до документа будь-які зміни, відправити його по електронній пошті, роздрукувати - одним словом, розпорядитися на свій розсуд у звичній йому середовищі. Так само легко він може змінити і шаблон документа - для цього достатньо вміти працювати в текстовому редакторі.

    Але цю ідилічну картину затьмарює кілька неприємних моментів. По-перше, недостатня гнучкість програми - якщо ви захочете перейти на інший редактор, то доведеться писати код заново. По-друге, програма працює тільки у середовищі пакета 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. Національні символи до керуючої інформації не відносяться.

    В як керуючих символів використовуються окремі літери. Перед кожним керуючим символом вводиться зворотна коса риска (). Наприклад, фрагмент:

    ... f1fs20 ...

    встановлює шрифт № 1 розміром в 20 одиниць.

    Фрагмент RTF-файлу наведено нижче. Структура його, як можна бачити, нагадує структуру HTML-документа:

    intblphmrgposy371dxfrtext180dfrmtxtx180dfrmtxty0nowrap

    aspalphaaspnumfaautoadjustrightrin0lin0f1fs20lang1049

    langfe1049cgridlangnp1049langfenp1049 (lang1033langfe1049

    langnp1033 11cell 12cell 13cell) pard ql li0ri0widctlparintbl

    aspalphaaspnumfaautoadjustrightrin0lin0

    В RTF-форматі існує можливість поєднувати окремі послідовності в групи за допомогою дужок:

    (група)

    Такі групи створюються, наприклад, при описі виносок, колонтитулів, закладок і т.п.

    Ось деякі керуючі слова і символи, що мають безпосереднє відношення до теми нашої статті:

    раr - Кінець абзацу;

    сеll - Кінець стовпця;

    row - Кінець рядка (або таблиці);

    * bkmkstart <назву закладки> * bkmkend - закладка. Приклад: (* bkmkstart ndoc) BS190 (* bkmkend ndoc);

    pard - Встановлює стандартну настройку для абзацу;

    intbl ... Intbl - виділяє область таблиці;

    ' - Прямий введення в текст шістнадцятиричних чисел. При збереженні кириличного тексту він зазвичай зберігається в шістнадцятковій формі, наприклад:

    'd1'f2'f0'ee'ea'e0 (' рядок ')

    Оскільки нас цікавлять тільки певні завдання, знання наведених вище керуючих слів і символів цілком достатньо. Умовимося для простоти називати керуючі слова і символи тегами.

    А тепер розглянемо алгоритми рішення трьох основних завдань, що виникають при створення документації.

    Вставка рядка на місці закладки

    Приклад такої закладки:

    ... (* bkmkstart ndoc) <значення закладку> (* bkmkend ndoc) ...

    Для вирішення даного завдання можна запропонувати наступний алгоритм.

    Читаємо послідовно рядка вхідного файлу (у більшості випадків рядок більше 255 символів).

    Шукаємо в поточному рядку тег 'bkmkstart'.

    Якщо знаходимо, то виділяємо назву закладки і порівнюємо його з шуканої.

    Якщо збігається, то записуємо строкову рядок даних після закриває дужки ()).

    Алгоритм реалізований у вигляді функції In_Zakl1 (pth As String, zakl As String, data As String), де pth - ім'я RTF-файлу, zakl - ім'я закладки, data - рядок для додати у файл.

    Додавання рядків у таблицю

    Припустимо, нам потрібно знайти m-й рядок у n-тої таблиці і повторити її в цій таблиці p разів. Для пошуку початку рядка таблиці ми будемо використовувати тег intbl, а для пошуку кінця - тег row. Кінець самої таблиці визначається за послідовністю тегів row ... pard ... par.

    Алгоритм вирішення цього завдання наступний.

    Читаємо послідовно рядка вхідного файлу.

    Шукаємо послідовність ... row ... pard ... par ... intbl ... (не обов'язково в одному рядку) (n-1) разів. Після цього ми перебуваємо на початку потрібної таблиці.

    Шукаємо тег row (m-1) разів. Після цього знаходимося перед потрібної рядком таблиці.

    Шукаємо наступний тег row і копіюємо вміст файлу від (m-1)-го до m-го тега row (між row і intbl містяться налаштування рядки, вони нам теж потрібні).

    Вставляємо після m-го тега row скопійовану нами підрядок p раз.

    Слід відзначити, що недоліком запропонованого алгоритму є те, що він може копіювати будь-який рядок таблиці, крім першої. Але в більшості випадків першим рядок є "шапкою" документа і копіювати її немає необхідності.

    Алгоритм реалізований у вигляді функції In_TStr (pth As String, itbl As Integer, irow As Integer, kol As Integer), де pth - ім'я RTF-файлу, itbl - номер таблиці, irow -- номер рядка, kol - кількість повторів рядка.

    Заповнення комірки таблиці

    Уявімо, що потрібно знайти k-у клітинку в m-й рядку n-й таблиці і вставити в неї текстовий рядок даних. Приклад таких осередків:

    ... (lang1033cgrid0 <вміст 1-й осередки>

    cell <вміст 2-й осередки> cell) ...

    Завдання може бути вирішена за наступним алгоритмом.

    Читаємо послідовно рядка вхідного файлу.

    Шукаємо послідовність ... row ... pard ... par ... intbl ... (не обов'язково в одному рядку) (n-1) разів. Після цього ми знаходимося перед потрібної нам таблицею.

    Шукаємо тег row (m-1) разів. Після цього ми перебуваємо на початку потрібної рядки таблиці.

    Шукаємо k-e входження тега cell.

    Вставляємо перед ним рядок даних.

    Даний алгоритм реалізований у вигляді функції 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 - кількість рядків у звіті

    ' NewData (5, NumStr) - масив з даними для заповнення

    ' таблиці, заздалегідь приведеними до символьному увазі

    ' Itog - сума, приведена до символьному увазі

    ' pth - шлях до файлу

    ' Str_ndoc = "BS190"

    ' Str_name = "Петров І.І."

    Dim res As Boolean 'результат виконання функцій

    ' заповнюємо "шапку документа" - номер і одержувач

    ' - Закладки 'ndoc' і 'name' відповідно

    res = In_Zakl1 (pth, "ndoc", Str_ndoc)

    res = In_Zakl1 (pth, "name", Str_name)

    ' вставляємо потрібну кількість рядків-1

    ' (тому що одна вже є в шаблоні)

    res = In_TStr (pth, 1, 2, NumStr -- 1)

    ' для кожного рядка в кожну клітинку вставляємо

    ' потрібні дані з масиву

    For i = 1 To NumStr

    For j = 1 To 5

    res = In_Tcell1 (pth, 1, i + 1, j, NewData (j, i))

    Next j

    Next i

    res = In_Tcell1 (pth, 1, NumStr + 2, 5, Itog)

    ' проставляємо суму "Усього"

    Висновок

    Які переваги та недоліки запропонованої технології? Почнемо з переваг. По-перше, це більш гнучка технологія для формування звітів - навіть якщо частина користувачів працює з OpenOffice, а частина з MS Office, програма створення звітних документів універсальна. По-друге, незважаючи на багаторазову перезапис файлу шаблону під час роботи, ця програма працює швидше, ніж зв'язка OLE + Word. Тим більше, що наведені вище алгоритми можуть удосконалюватися. Один із прикладів кардинального підвищення продуктивності наведено в лістингах варіанту для PascalDelphi. По-третє, користуючись вільним ПЗ, ви економите гроші.

    Тепер про проблеми. Основна з них - це недостатня стандартизація формату RTF. Виробники ПЗ, в цілому дотримуючись єдиного стандарту, допускають кілька вільне трактування приватних моментів. Результат - проблеми з використанням "чужих" RTF-файлів, підготовлених в інших редакторах. Наприклад, MS Word зберігає графічні зображення усередині RTF-файла у вигляді послідовності шістнадцятиричних кодів, а OOWriter - як зовнішній файл.

    Втім, ці проблеми вирішуються - варто лише прикласти деякі зусилля.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.citforum.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status