Использование шаблонного документа 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. Все права защищены.