Вопрос
Как мне вывести данные в существующий MS WORD документ?
Ответ
Вариантов решения данной проблемы много. В данном случае будет рассмотрен вариант решения через предварительно созданный файл шаблона (файл с расширение DOT)
Сначала необходимо создать документ (шаблон) MS Word в который впоследствии будут вставлены нужные данные. Этот документ следует сохранить как шаблон MS Word.
В те места, где предполагается вставлять значения следует вставить специальные объекты, которые называются "Поля".
Эти объекты вставляются через пункт меню Word "Вставка", подпункт "Поле". При выборе данного пункта меню в появившейся форме следует выбрать поле с именем "Quote". Это поле относится к категории "Связи и ссылки". Введите в свойстве поля "Текст" какой-либо текст (он будет заменен при заполнении из FoxPro), установите, если надо, формат данных и нажмите кнопку "Ok".
Поле будет вставлено в документ MS Word, однако по умолчанию этот факт никак не отображается. Чтобы наглядно увидеть вставленный объект выделите весь текст, нажмите на выделенном тексте правой клавишей мыши и выберите пункт открывшегося меню "Коды/Значения полей".
То же самое можно сделать через общие настройки MS Word. Пункт главного меню "Сервис" - подпункт "Параметры" - Закладка "Вид" - Раздел "Показывать" - птичка "Коды полей".
Чтобы внести изменения в код поля выделите его, нажмите правую кнопку мыши и выберите пункт открывшегося меню "Изменить поле".
Повторите вставку "Поля" во все места, где Вы предполагаете впоследствии подставить собственные данные.
Если Вы хотите сделать вставку в таблицы в MS Word, то в ячейках этих таблиц вообще ничего не надо вставлять.
Все. С предварительной подготовкой закончили. Сохраните полученный документ как шаблон MS Word и закройте его.
Программное наполнение такого предварительно созданного шаблона будет выглядеть примерно так:
* Создаем новый документ MS WORD на базе ранее созданного шаблона LOCAL loWord, loDoc loWord = CREATEOBJECT( 'WORD.APPLICATION') loDoc=m.loWord.Documents.Add('Полный_путь_доступа'+'Имя_файла_шаблона.dot') * Подставляем необходимые значения в поля m.loDoc.Fields(число_порядковый_номер_поля).Result.text="Текст" * Для заполнения данных таблиц WORD принцип такой m.loDoc.Tables(число_порядковый_номер_таблицы).Cell(число_ряд,число_колонка).Range.Text="Текст" * Делаем созданный документ видимым m.loWord.Visible = .T.
Однако рассмотренный вариант имеет тот недостаток, что к созданным полям приходится обращаться по номерам. Это не всегда удобно. Было бы проще, если бы поля имели символьное обозначение. Поэтому, рассмотрим еще один вариант.
Также предварительно создаем файл шаблона, но в качестве вставляемых объектов будем использовать не "Поля", а "Поля формы". Для этого надо активизировать специальный ToolBar с именем "Формы" (Пункт главного меню "Вид" - "Панели инструментов" - "Формы").
Вставляем курсор на нужное место в шаблоне и нажимаем на панели инструментов "Формы" самую левую иконку с буквами "ab". В текущее место шаблона будет вставлен специальный объект "Поле формы".
Дважды щелкните левой клавишей мыши по "Полю формы" и откроется дополнительное окно свойств этого объекта. Сейчас нас интересует его свойство "Закладка". Это и будет то самое, символьное обозначение объекта, по которому к нему можно будет обратиться из программы.
Это обозначение (закладка) может быть любое. Единственное ограничение - оно должно быть уникально в пределах всего шаблона. Впрочем, за этим проследит сам Word.
Предположим, что Вы оставили закладку в значении по умолчанию "ТекстовоеПоле1". Тогда изменение его содержимого из программы будет иметь вид:
* Создаем новый документ MS WORD на базе ранее созданного шаблона LOCAL loWord, loDoc loWord = CREATEOBJECT( 'WORD.APPLICATION') loDoc=m.loWord.Documents.Add('Полный_путь_доступа'+'Имя_файла_шаблона.dot') * Подставляем необходимые значения в поля IF TYPE([m.loDoc.FormFields("ТекстовоеПоле1")])="O" m.loDoc.FormFields("ТекстовоеПоле1").Result="Новое значение" ENDIF * Делаем созданный документ видимым m.loWord.Visible = .T.
К сожалению, такой синтаксис возможен только для Word 2000 или старше. Для младших версий Word придется по старинке обращаться через порядковый номер. Точнее, надо будет сканировать коллекцию FormFields на предмет поиска "Поля формы" со свойством Name = "ТекстовоеПоле1". Примерно так:
LOCAL lnI FOR lnI=1 TO m.loDoc.FormFields.Count IF m.loDoc.FormFields(m.lnI).Name == "ТекстовоеПоле1" m.loDoc.FormFields(m.lnI).Result="Новое значение" ENDIF ENDFOR