Основы офисного программирования и документы Word

         

Таблицы в документах


Таблицы, таблицы, таблицы… Серьезных документов без них не бывает. Они могут быть разных типов. С документом Word связываются следующие классы коллекций, задающие те или иные таблицы: Tables, TablesOfContents, TablesOfFigures, TablesOfAuthoritiesCategories, TablesOfAuthorities.

Класс Table определяет "обычные" таблицы с произвольным количеством строк и столбцов и произвольным заполнением полей. Остальные классы задают таблицы специального вида. В следующем примере открывается документ с именем DocThree и в него вставляется несколько таблиц:

  • В начало документа вставляется специальная таблица, позволяющая автоматически создать оглавление нашего документа. Эта таблица представляет элемент коллекции TablesOfContents. Замечу, что автоматическое создание оглавления предполагает использование для заголовков документа стандартных стилей. Если же Вы используете для этих целей собственные стили с именами, отличными от Heading, то программно создать оглавление не удастся.
  • В конец этого документа вставляется обычная таблица. Здесь же происходит заполнение ячеек таблицы, что позволяет продемонстрировать возможности программной работы с элементами таблицы.
  • На следующем шаге процедуры WorkWithTables вызывается процедура, вставляющая в документ еще одну автоматически заполняемую таблицу специального вида элемент коллекции TablesOfFigures. О ней поговорим чуть позже, а пока приведем текст процедуры, решающей эти три задачи:

Листинг 1.29.

(html, txt)

Поскольку обычные таблицы является частью большинства документов Word, то стоит сказать о них чуть подробнее. При работе вручную таблицы можно вставлять в документ двумя способами. Более простые таблицы с фиксированным числом строк и столбцов можно вставить в документ, вызвав из меню Table (Таблица) пункт Insert (Вставить). В открывшемся диалоговом окне можно указать число строк и столбцов добавляемой таблицы и некоторые ее свойства, управляющие размерами ее ячеек. Если же необходимо построить таблицу более сложного вида, то из меню Table вызывается пункт Draw (Рисовать). В этом случае в руках у пользователя "появляется" карандаш и с его помощью можно нарисовать таблицу довольно сложной конфигурации. Я уже говорил ранее, что MacroRecorder не может следить за действиями пользователя, рисующего такую таблицу. Однако он вполне справляется, когда пользователь вставляет таблицу с фиксированным числом строк и столбцов и, например, заполняет ее ячейки. Собственно говоря, объект Table и работа с ним в предыдущей процедуре является программным отображением моих действий по созданию и работе с такими таблицами. Возникает естественный вопрос, а можно ли программно создать таблицу сложной конфигурации, например, подобную таблице Менделеева, можно ли работать программно с такими таблицами? Ответ, естественно, положителен. Программное построение таблицы сложной конфигурации обеспечивается тем, что, используя метод Cell, можно получить доступ к любой из ячеек таблицы, (в предыдущем примере показано, как это можно сделать), а затем к отдельной ячейке можно применить метод Split, расщепив ее на нужное количество строк и столбцов. Вот пример программной работы с таблицей Менделеева:


Sub WorkWithDrawingTable() ' В этой процедуре демонстрируется работа 'с рисованной таблицей Менделеева Documents("ExampleOfTable").Activate Dim DrawTable As Table Set DrawTable = ActiveDocument.Tables(1) With DrawTable Debug.Print "Столбцов - ", .Columns.Count Debug.Print "Строк - ", .Rows.Count Debug.Print .Cell(5, 1).Range.Text 'Усложняем конфигурацию .Cell(4, 5).Split 2, 3 End With End Sub
Листинг 1.30.
(html, txt)
Замечу, что программно работать с такими таблицами довольно сложно, так как здесь трудно понять, какие индексы будет иметь та или иная ячейка таблицы, после того как, например, одна из ячеек таблицы расщеплена на несколько ячеек. Так что можно понять, почему MacroRecorder отказывается транслировать действия пользователя, рисующего сложную таблицу, и не может создать текст соответствующего макроса. Он (MacroRecorder) не может разобраться, с какой ячейкой работает пользователь в текущий момент. В заключение еще раз повторю, что программно работать с таблицами сколь угодно сложной конфигурации, допустимой в Office 2000, хотя и сложно, но вполне возможно.
Помимо "обычных" таблиц есть возможность создавать и работать с большим числом специальных таблиц, заполняемых автоматически при их создании. Пример одной из таких таблиц таблицы, создающей оглавление документа уже приведен. Есть еще несколько видов специальных таблиц, аналогичных таблице оглавления. Такие таблицы позволяют строить автоматически ссылки на иллюстрации, используемые в документах, на цитируемые источники и так далее. Рассмотрим теперь более подробно работу с еще одной из специальных таблиц, содержащей ссылки на иллюстрации, используемые в документе. В документах Word типичным является использование большого числа иллюстраций - таблиц, графиков, диаграмм. Зачастую, наряду с оглавлением документа полезно в документе иметь аналоги оглавления, содержащие ссылки на иллюстративные элементы документа. Для этой цели и используются специальные таблицы объекты класса TableOfFigures. Вот процедура, создающая две такие таблицы, первая из которых содержит ссылки на графики, вторая на таблицы:
Листинг 1.31.
(html, txt)
Заметьте, что заголовки иллюстративных элементов, попадающих в соответствующие таблицы, должны быть "настоящими" заголовками и содержаться в коллекции CaptionLabels, о работе с которой я уже подробно рассказывал.


Листинг 1.30.
Замечу, что программно работать с такими таблицами довольно сложно, так как здесь трудно понять, какие индексы будет иметь та или иная ячейка таблицы, после того как, например, одна из ячеек таблицы расщеплена на несколько ячеек. Так что можно понять, почему MacroRecorder отказывается транслировать действия пользователя, рисующего сложную таблицу, и не может создать текст соответствующего макроса. Он (MacroRecorder) не может разобраться, с какой ячейкой работает пользователь в текущий момент. В заключение еще раз повторю, что программно работать с таблицами сколь угодно сложной конфигурации, допустимой в Office 2000, хотя и сложно, но вполне возможно.
Помимо "обычных" таблиц есть возможность создавать и работать с большим числом специальных таблиц, заполняемых автоматически при их создании. Пример одной из таких таблиц таблицы, создающей оглавление документа уже приведен. Есть еще несколько видов специальных таблиц, аналогичных таблице оглавления. Такие таблицы позволяют строить автоматически ссылки на иллюстрации, используемые в документах, на цитируемые источники и так далее. Рассмотрим теперь более подробно работу с еще одной из специальных таблиц, содержащей ссылки на иллюстрации, используемые в документе. В документах Word типичным является использование большого числа иллюстраций - таблиц, графиков, диаграмм. Зачастую, наряду с оглавлением документа полезно в документе иметь аналоги оглавления, содержащие ссылки на иллюстративные элементы документа. Для этой цели и используются специальные таблицы объекты класса TableOfFigures. Вот процедура, создающая две такие таблицы, первая из которых содержит ссылки на графики, вторая на таблицы:
Public Sub WorkWithTablesOfFigures() 'Работа с таблицами ссылок на иллюстрации документа Dim DocPath As String Dim myr As Range Dim ToF As TableOfFigures Dim capt As CaptionLabel 'Открываем и активизируем документ DocThree DocPath = Documents("DocOne").Path Documents.Open (DocPath & "\Docthree") Documents("Docthree").Activate
With ActiveDocument
Set myr = Selection.Range myr.Select 'Создаем таблицы ссылок на графики и таблицы 'Оба заголовка должны быть элементами коллекции CaptionLabels .TablesOfFigures.Add Range:=myr, Caption:="График" .TablesOfFigures.Add Range:=myr, Caption:="Table"
For Each ToF In .TablesOfFigures Debug.Print ToF.Caption Next ToF For Each capt In Application.CaptionLabels Debug.Print capt.Name Next capt End With End Sub
Листинг 1.31.
Заметьте, что заголовки иллюстративных элементов, попадающих в соответствующие таблицы, должны быть "настоящими" заголовками и содержаться в коллекции CaptionLabels, о работе с которой я уже подробно рассказывал.

Содержание раздела