Вывод данных в документ MS Word

Использование шаблонного документа MS Word для формирования отчета

  • Автор: Still Zero
  • Уровень знаний: начальный
  • Подразделы: нет
  • Дата публикации: 26.05.2005

В моей практике встречалась несколько раз следующая задача: необходимо напечатать отчет, содержащий текст договора. Текст договора размещается на 6-ти страницах. На этих страницах в разных местах размещаются данные из моей программы, например, реквизиты фирм, заключающих договор. Я к тому клоню, что данных мало, а текста безумно много. И если вы попытаетесь набрать текст договора в стандартном форматере отчетов, то, если мягко сказать, проклянете все на свете.
К счастью существует простой и легкий путь для решения этой задачи. Суть метода в использовании шаблона документа. Т.е. у вас существует заготовка отчета, в котором указано в какие места, какие данные вставлять. Остается только открыть этот шаблон и заполнить необходимыми данными.
В качестве шаблона могут выступать документы различных форматов. Вы можете использовать MS Excel, MS Word, Notepad или HTML для подготовки шаблона. В этой статье я расскажу каким образом записать данные в документ MS Word-а при помощи OLE.

Создание шаблона
Откройте MS Word и создайте новый документ. Заполните его необходимым содержимым. Расставьте определенные вами «метки» в документе, в которые вы будете вставлять данные. Я для этих целей использую квадратные скобки и понятное для меня имя переменной, например так:

ФИО сотрудника: [DATA:FIO]

Здесь «ФИО сотрудника» — текст шаблона, а «[DATA:FIO]» — метка.

Сохраните шаблон.

Макросы
MS Office имеет встроенный язык VBA (Visual basic for application), с помощью которого можно создавать программы для приложений пакета. VBA для MS Word-а и для MS Excel-я несколько отличаются, но суть использования одна.
OLE это технология, позволяющая использовать объекты, созданные другими приложениями. Эти объекты «встраиваются» в операционную систему при установке/первом запуске приложения.
MS Word добавляет в систему несколько объектов, такие как Word.Basic, Word.Document, Word.Picture и т.п. Я рекомендую использовать объект Word.Application, так как этот объект позволяет использовать все методы VBA.
Первое, что необходимо сделать — открыть шаблонный документ. Для этого необходимо выполнить команду VBA. Я не знаю синтаксис команды открытия документа и не вижу надобности запоминать или учить VBA. Я использую такую возможность MS Word-а как запись макроса. Откройте «пустой» MS Word. Зайдите в меню «Сервис/Макрос/Начать запись», задайте имя макроса. Теперь меню «Файл/Открыть», выберете необходимый шаблонный документ. Остановите запись макроса (Сервис/Макрос/Остановить запись). Все. MS Word подготовил набор команд для открытия документа, для просмотра необходимо зайти в меню «Сервис/Макрос/Макросы». В списке выберите ваш записанный макрос и нажмите изменить. Откроется окно редактора VBA, в которым вы увидите текст макроса.
VBA использует «родную» dot-нотацию для своих методов и свойств. К сожалению использование dot-нотации в Кларионе разрешено не всегда. Но, в MS Word-е предусмотрена также «старая»-нотация, которую Кларион поддерживает.

Как вы видите из рисунка, команда открытия документа содержит всего лишь один обязательный параметр — имя открываемого файла, остальные параметры необязательны.
Таким образом, используя макросы, вы можете получить информацию по необходимым вам командам наиболее быстро. Хотя без чтения документации все же не обойтись 🙂

Кодирование
Я думаю, вы поняли как узнать команды VBA необходимые для выполнения вашей задачи. В нашем случае последовательность команд такова:

  • открыть шаблонный документ
  • найти метки и заменить их на данные
  • сохранить документ под другим именем

Перед тем как начать выполнение команд VBA необходимо создать объект OLE. Это можно сделать, добавив OLE-контрол на окно, или, что я рекомендую, использовать нижеследующий код:

feqOLE   LONG                          ! метка OLE-контрола
code
feqOLE=create(0,CREATE:Ole)            ! создали OLE-контрол
feqOLE{Prop:Create}='Word.Application' ! сказали, что этот контрол использует Word
feqOLE{Prop:ReportException}=TRUE      ! для отладки-показываем сообщения об ошибках OLE
:
destroy(feqOLE)                        ! уничтожили OLE-контрол

Здесь используется динамическое создание контролов и свойства OLE-контролов. Подробнее о этих и других свойствах вы можете прочитать в стандартной документации.

Теперь можно выполнять команды VBA:

feqOLE{'Visible'}=1                                     ! показали Word
feqOLE{'Documents.Open("C:C55APPSOleWordtest.doc")'}! открыли шаблонный документ
feqOLE{'Selection.Find.ClearFormatting'}                ! очистили ранее указанные параметры поиска
feqOLE{'Selection.Find.Replacement.ClearFormatting'}    !очистили ранее указанные параметры замены
! ищем '[DATA:FIO]' и меняем на 'Иванов', по всему документу
feqOLE{'Application.Selection.Find.Execute("[DATA:FIO]",,,,,,1,1,,"Иванов", 2)'}
feqOLE{'Application.Selection.GoTo(11, 1)'}             ! встали на начало документа
feqOLE{'Application.ActiveDocument.SaveAs("C:C55APPSOleWordtest1.doc")'} ! сохранили документ

Известные проблемы
В разных версиях MS Office команды VBA могут отличаться друг от друга.
Во многих командах VBA используются константы. Для того чтобы узнать значение команды используйте макрос VBA: «MsgBox константа», который покажет окно с значением этой константы.
Для открытия/сохранения документов желательно использовать полный путь к файлу. Если вы укажете только имя файла, например, «test.doc», то MS Word будет считать, что файл находится в папке «Мои документы».
После использования объекта вы должны его уничтожить командой DESTROY. Но после выполнения этой команды winword.exe все равно остается «висеть» в списке процессов, т.е. не происходит его реального уничтожения. На практике его уничтожают «три раза» 🙂

loop 3 times
    destroy(feqOLE) ! уничтожили OLE-контрол
end

Пример собран на C55H, ABC (для Legacy код будет абсолютно таким же).
Пример проверен на MS Office XP.
Не забудьте указать корректные пути к файлу шаблона.

OLE MS Word (1029)
© Project Zero, 2005-2006. Все права защищены.