:: Главная :: Решения :: Статьи :: Проект "Русский help" :: Файловый архив :: Фотоальбом :: Ссылки ::
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  


Форумы  :: FAQ FoxPro

Как заполнить таблицу в MS Word
Дата: 20.01.07 16:35:12 ОтветитьЦитировать

Вопрос

Как заполнить таблицу в документе 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 станет занимать слишком много времени, то следует подумать о способах оптимизации этого процесса. Есть разные варианты, но здесь их описывать не имеет смысла.
Ratings: 0 negative/0 positive


Тема Просмотров Написано Написано
  Работа с другими программами из FoxPro (Word, Excel и т.п.) 14873 Владимир Максимов 01.03.05 20:53
  Как мне вывести данные в существующий MS WORD документ 17834 Владимир Максимов 20.04.05 18:44
  Как открыть файл в другом приложении 13423 Владимир Максимов 15.06.05 21:18
  Как узнать значение константы Word или Excel 9694 Владимир Максимов 18.09.05 10:24
  Как узнать какая команда Word или Excel выполняет нужное действие 10796 Владимир Максимов 18.09.05 10:34
  Как заполнить таблицу в MS Word 14803 Владимир Максимов 20.01.07 16:35


Извините, но у вас нет прав для того, чтобы писать в этом форуме.

On-line: 47 Simple777 Mitchman  and Guests: 45


© 2006 Fox Club 
Яндекс.Метрика