Работа с другими программами

HomeFAQЧасто задаваемые вопросыРабота с другими программами
Как мне вывести данные в существующий MS WORD документ

Вопрос
Как мне вывести данные в существующий 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

 

Как открыть файл в другом приложении

Вопрос

У меня есть файл, созданный в другом приложении (XLS, PDF, DOC и т.п.). Как мне из FoxPro открыть соответствующее приложение и открыть в нем этот файл.

Ответ

Для этой цели используется специальная API-функция ShellExecute

Declare Long ShellExecute in Shell32 ;   
  	Long 	hWnd, ;		&& хендл родительского окна  
  	String 	lpOperation, ;	&& что сделать с файлом "open", "print",  "explore"  
  	String 	lpFile, ;		&& имя файла. Можно с путем доступа  
  	String 	lpParameters, ;	&& используется только для исполняемых файлов  
  	String 	lpDirectory, ; 	&& директория, относительно которой надо искать файл  
  	Integer 	ShowCmd 	&& режим открытия приложения  
    
 * Это откроет Acrobat (если он есть)  
  mKod=ShellExecute(0, "open", "uidesign1.pdf", NULL, "C:\text", 1)   
    
 * Это отправит сразу на печать  
  mKod=ShellExecute(0, "print", "uidesign1.pdf", NULL, "C:\text", 1)   
    
 * Это откроет проводник Windows на указанной директории   
  mKod=ShellExecute(0, "explore", "C:\text", NULL, NULL, 1)

Если функция ShellExecute вернула значение больше 32, то команда выполнена успешно. В противном случае произошла какая-то ошибка.

Следует иметь в виду, что функция ShellExecute откроет только те файлы, расширение которых ассоциировано в операционной системе Windows с каким-либо приложением. Например, если на машине пользователя не установлен Acrobat, то и файлы с расширением pdf не смогут быть открыты. Просто нечем.

Также следует понимать, что Вы не можете из FoxPro получить доступ к приложению открытому через ShellExecute. Это приложение будет открыто как отдельный независимый от FoxPro процесс.

Если у вас стоит задача только открыть файл, то можно воспользоваться COM-интерфейсом Shell API следующим образом

  
  Local loShell  
  loShell = CreateObject('Shell.Application')  
  loShell.Open("C:\text\uidesign1.pdf")

Кроме того, использование COM-интерфейса вызовет стандартный диалог Windows с предложением выбрать приложение, если в системе Windows не зарегистрировано приложение ассоциированное с указанным расширением файла.

К сожалению, через COM-интерфейс Shell API невозможно отправить документ на печать. В этом случае придется воспользоваться напрямую API-функцией ShellExecute

Как узнать значение константы Word или Excel

Вопрос

Как узнать значение константы Word или Excel?

Ответ

  • Откройте Word или Excel, для которых Вы хотите узнать значение константы
  • Выберите пункт главного меню "Сервис" - "Макрос" - "Редактор Visual Basic" (или по горячей клавише Alt+F11)
  • В открывшемся окне выберите пункт главного меню "View" - "Object Browser" (или по горячей клавише F2)
  • Далее в пустом окошке слева от кнопки с иконкой бинокля ввести имя искомой константы и нажать кнопку с иконкой бинокля (или клавишу Enter).

    В результате поиска в самом низу окна "Object Browser" будет отображено значение искомой константы.

Как узнать какая команда Word или Excel выполняет нужное действие

Вопрос

Как узнать какая команда Word или Excel выполняет нужное действие.

Ответ

В программах Word и Excel существует режим автоматической записи всех действий пользователя данных программ. Поэтому достаточно просто включить этот режим, выполнить необходимое действие и посмотреть какая же именно команда отвечает за его выполнение.

Для этого выбирается пункт меню Excel с именем "Сервис" - "Макрос" - "Начать запись". В появившемся окне указываем имя макроса (по умолчанию "Макрос1") и нажимаем кнопку "Ok". В результате, поверх листа Excel появляется маленькое специфическое окошко - ToolBar - с именем "Остановить запись" и все Ваши действия будут автоматически записываться.

После того, как Вы выполните все необходимые действия, остановите запись макроса. Для этого просто нажмите иконку с черным квадратиком в этом ToolBar с именем "Остановить запись". Далее выберите пункт меню Excel с именем "Сервис" - "Макрос" - "Макросы". Выберите имя только что записанного макроса (по умолчанию "Макрос1") и нажмите кнопку "Изменить".

Откроется окно редактора Micosoft Visual Basic в котором будет отображен код Вашего макроса.

Правда, следует заметить, что "в чистом виде" использовать полученный код макроса в FoxPro нельзя. Необходимо его слегка "адаптировать". Как это сделать рассматривается в статье

Перевод макроса Excel в синтаксис FoxPro

Кроме того, следует понимать, что таким образом Вы сможете определить только те команды, которые можно визуализировать. Т.е. выполнение этих команд приводит к каким-либо изменениям на экране. Все прочие команды следует искать в справочном руководстве по диалекту языка Visual Basic соответствующего продукта.

Как заполнить таблицу в MS Word

Вопрос
Как заполнить таблицу в документе MS Word данными из таблицы FoxPro?

Ответ

Прежде всего, следует серьезно обдумать возможность использования вместо прграммы MS Word для отображения табличных данных программы MS Excel. Поскольку именно эта программа предназначена для заполнения табличных данных. Для MS Word таблица – это вспомогательный элемент.

Впрочем, заполнение таблицы MS Word, в своей основе, мало отличается от заполнения таблицы в MS Excel. Точно также происходит адресация к конкретной ячейке с последующим изменением одного из свойств этой ячейки. Сложность заключается именно в способе адресации.

Адресацию к объектам MS Word можно сравнить с адресацией к объектам формы в FoxPro. Вы ведь можете положить объект TextBox как собственно на форму, так и на закладку PageFrame или внутрь объекта контейнера. Соответственно, изменится и способ адресации к объекту. Надо будет указать в иерархии все те объекты-контейнеры, внутри которых расположен нужный Вам объект.

Правда, MS Word имеет и другое отличие от объектов FoxPro. Как правило, Вы обращаетесь к объектам формы в FoxPro по их именам. Объекты MS Word, как правило, собственных имен не имеют. Все объекты MS Word являются членами тех или иных коллекций и обращение к ним происходит по их индексам внутри соответствующих коллекций.

Следовательно, в общем случае, адресация к таблице в MS Word будет иметь вид

Приложение_Word.Коллекция_Документов(Индекс_Документа).Коллекция_Таблиц(Индекс_Таблицы)

Но это только в том случае, если таблица лежит непосредственно на листе документа. Если же она вложена в другой объект, то между "Коллекцией_Документов" и "Коллекцией_Таблиц" необходимо добавить коллекцию объекта-контейнера.

Существенным недостатком такого способа адресации является невольная привязка к физическому порядку добавления объектов в документ MS Word. Например, если Вы добавили нужную Вам таблицу физически самой первой, то она, естественно, будет самой первой в коллекции таблиц. Но если Вы в процессе модификации шаблона документа вырежете Вашу таблицу, создадите новую таблицу, а потом восстановите старую таблицу, то она окажется уже второй в коллекции таблиц. Эту особенность следует помнить при написании программ заполнения таблиц в MS Word.

Сначала создадим шаблон, с которым и будем в дальнейшем работать.

Создайте новый документ MS Word. Лучше создавать не файл документа (расширение .Doc), а файл шаблона документа (расширение .Dot).

Теперь создайте в этом документе таблицу из 2 строк и любого количества столбцов. Это можно сделать, нажав иконку в виде таблицы. Если такой иконки нет, то выберите пункт меню "Таблица", подпункт "Нарисовать таблицу". Почему всего две строки? Сейчас объясню.

Первая строка будет строкой заголовка таблицы. Поставьте указатель курсора в любую ячейку первой строки таблицы, далее выберите пункт меню "Таблица", подпункт "Заголовки". Визуально ничего не изменилось. Однако если Вы снова выберете пункт меню "Таблица", то слева от подпункта "Заголовки" окажется "птичка". Т.е. текущая строка таблицы относится к заголовку таблицы.

Заголовок таблицы обладает тем свойством, что он автоматически копируется на новую страницу документа, если количество строк таблицы занимает больше, чем одну страницу. Собственно, можете сразу заполнить строку заголовка, т.к. вряд ли ее содержимое будет зависеть от данных в таблице FoxPro.

Итак, в результате, в документе появилась одна таблица из двух строк. Причем первая строка помечена как заголовок. Вторая строка предназначена для заполнения собственно данными.

Но ведь данных, скорее всего, будет больше, чем одна строка! Верно. Проблема только в том, что Вы заранее не знаете, сколько именно строк будет в таблице. Следовательно, придется формировать строки программно. В процессе заполнения таблицы.

Теперь, после всех этих предварительных подготовок, пишем собственно код в FoxPro.

  
 *Создаем новый документ MS WORD на базе ранее созданного шаблона  
  LOCAL loWord as Word.Application   
  loWord = CREATEOBJECT('Word.Application')  
    
 * Делаем созданный экземпляр приложения Word видимым  
 * В реальном проекте эта команда дается в самом конце,  
 * но здесь выносим ее в начало для отладки  
  m.loWord.Visible = .T.  
    
 * Создаем новый документ MS WORD на базе ранее созданного шаблона  
  LOCAL loDoc as Word.Document  
  loDoc = m.loWord.Documents.Add(fullpath('TestWord.dot'))  
    
 * Формируем ссылку на таблицу документа Word  
 * В данном случае нужная таблица - это физически самая первая таблица   
 * в коллекции таблиц, расположенной непосредственно на листе документа  
  LOCAL loTable as Word.Table   
  loTable = m.loDoc.Tables(1)  
    
 * Для заполнения таблицы Word создадим таблицу в FoxPro  
  CREATE Cursor Test (TestId I, TestName C(10))  
  INSERT INTO Test (TestId, TestName) VALUES (1, "Первая")  
  INSERT INTO Test (TestId, TestName) VALUES (2, "Вторая")  
  INSERT INTO Test (TestId, TestName) VALUES (3, "Третья")  
  INSERT INTO Test (TestId, TestName) VALUES (4, "Четвертая")  
  INSERT INTO Test (TestId, TestName) VALUES (5, "Пятая")  
    
 * Теперь собственно заполнение  
 * Счетчик, показывающий, какую строку таблицы Word сейчас заполняем  
  LOCAL lnWordRowNum  
 * Первая строка таблицы Word - это заголовок, поэтому начальное значение равно 2  
  lnWordRowNum = 2  
  select Test  
  SCAN  
 	* Сначала сравниваю общее количество строк в таблице со значением счетчика  
  	IF m.loTable.Rows.Count < m.lnWordRowNum  
 		* Если количество строк меньше, то создаю новую строку  
  		m.loTable.Rows.Add()  
  	ENDIF  
  	  
 	* И собственно заполнение  
  	m.loTable.Cell(m.lnWordRowNum,1).Range.Text = Test.TestId  
  	m.loTable.Cell(m.lnWordRowNum,2).Range.Text = Test.TestName  
  	  
 	* Увеличиваю значение счетчика заполняемой строки Word  
  	lnWordRowNum = m.lnWordRowNum + 1  
  ENDSCAN

В этом коде 'TestWord.dot' - это имя созданного Вами файла шаблона. Здесь имя приведено просто в качестве примера. Использована функция FullPath(), чтобы получить полный путь доступа к этому файлу.

Синтаксис вида

LOCAL loWord as Word.Application

Это нововведение версии Visual FoxPro 7.0 для подключения механизма IntelliSens. Если у Вас младшая версия FoxPro, то можете писать в привычном синтаксисе.

LOCAL loWord

Собственно на работоспособность программы это никак не влияет. Это всего-лишь облегчение процесса программирования, но это никак, никоим образом, не влияет на работоспособность программы.

Существенным остается вопрос, откуда я узнал все эти методы и свойства собственно приложения MS Word. По большей части из документации по языку Microsoft Visual Basic, встроенному в программу MS Word. Встроен как сам язык, так и документация .

Хотя, поиск существенно облегчил механизм IntelliSens в FoxPro. Я сразу вижу все свойства и методы того или иного объекта и предполагаю, что именно мне может понадобиться. Затем смотрю документацию по языку Microsoft Visual Basic и уточню, действительно ли это то, что мне надо.

Если количество строк в таблице MS Word всегда одно и то же, или же Вам надо заполнить определенные места в обычном текстовом документе, то для этого лучше воспользоваться рекомендациями, приведенными в другой статье:

Как мне вывести данные в существующий MS WORD документ

Описанный в данной статье механизм заполнения таблицы относительно медленный, хотя и самый надежный. Впрочем, как правило, таблицы, заполняемые в MS Word относительно небольшого размера, поэтому общее время заполнения таблицы будет не велико. Если же процесс заполнения таблицы MS Word станет занимать слишком много времени, то следует подумать о способах оптимизации этого процесса. Есть разные варианты, но здесь их описывать не имеет смысла.

//////////////// ///////////////
Авторизация
*
*
Генерация пароля