2006 г.
Биллиг Владимир Арнольдович
Интернет-Университет Информационных Технологий, INTUIT.ru
Назад Оглавление Вперёд
Работа с документами и класс Document
Вспомним, что мы уже знаем о документах Word. Когда открывается приложение, создается коллекция документов Documents
, содержащая открытые документы. Если приложение Word создается в момент открытия документа Word, (заметим, что объект Word.Application
может быть создан и в программном проекте другого приложения, например, Excel), то в начальный момент коллекция содержит минимум один новый или ранее существовавший документ. Программно новый документ добавляется в коллекцию методом Add
, а уже существующий - методом Open объекта Documents
. Чтобы добраться до нужного документа в коллекции, достаточно указать его индекс - имя файла, хранящего документ, - или его порядковый номер в коллекции. Для той же цели можно использовать и метод Item
, но обычно он опускается. Метод Save
позволяет сохранить документ, а метод Close
, сохраняя документ в файле, закрывает его и удаляет из коллекции.
При применении метода Open
обязательно указывать имя, а точнее путь к открываемому файлу. Однако задание конкретного пути всегда чревато неприятностями, поскольку при любом переносе системы местоположение файла может измениться. В одной из предыдущих процедур этой лекции WorkWithSearch я демонстрировал возможность использования свойства Path
для нахождения пути к документу. Часто предпочтительнее предоставить пользователю возможность выбирать открываемый файл, хранящий документ. Для этого, конечно, можно использовать объект Dialog
, при вызове методов которого открывается соответствующее диалоговое окно.
Вот еще один пример использования уже знакомого нам объекта Dialog
FileOpen:
Public Sub WorkWithDialogs()
Dim dlg As Dialog
'Открытие документа в диалоге с пользователем
'Метод Show ведет диалог и открывает документ
Dialogs(wdDialogFileOpen). Show
'Метод Display ведет диалог, не открывая документа,
'но позволяя получить имя файла.
Set dlg = Dialogs (wdDialogFileOpen)
If dlg. Display = -1 Then 'нажата кнопка Open
Documents.Open FileName:=dlg.Name
End If
End Sub
Листинг 1: html, txt
Теперь подробнее рассмотрим свойства и методы документа - объекта класса Document
. Это основной объект, свойства, события и методы которого следует знать основательно. Объект Document
не менее сложен, чем объект Application
.
Коллекции объекта Document
Рассмотрим список коллекций, входящих в состав объекта Document
:
Bookmarks
Characters (Range)
CommandBars
Comments
DocumentProperties
Endnotes
Fields
Footnotes
FormFields
Frames
Hyperlinks
Indexes
InlineShapes
ListParagraphs
Lists
ListTemplates
Paragraphs
ProofreadingErrors (Range)
Revisions
ReadabilityStatistics
Scripts
Sections
Sentences (Range)
Shapes
StoryRanges (Range
Styles
Subdocuments
Tables
TablesOfAuthoritiesCategories (TableOfAuthoritiesCategory)
TablesOfAuthorities (TableOfAuthorities)
TablesOfContents (TableOfContents)
TablesOfFigures (TableOfFigures)
Variables
Versions
Windows
Words (Range)
Среди объектов, вложенных в объект Document
на первом уровне иерархии, коллекции составляют явное большинство - их 36. Каждая коллекция содержит элементы одного класса. Как правило, имя класса коллекции строится как множественное число (по правилам английского языка) от имени класса элемента коллекции. Например, коллекция Documents
содержит объекты класса Document
, а коллекция Paragraphs
содержит объекты класса Paragraph
. В тех случаях, когда это правило не выполняется, в скобках указано имя класса для объектов, входящих в коллекцию. Заметьте, например, что коллекции предложений, слов и символов документа Word состоят из объектов класса Range
.
Для некоторых из объектов этого списка указаны и встроенные в них объекты, лежащие на следующем уровне иерархии. В этих случаях курсивом выделены те объекты, которые не являются коллекциями.
Простые объекты, вложенные в объект Document
Объектов, вложенных на верхнем уровне иерархии в объект Document
, существующих в одном экземпляре и не имеющих соответственно коллекций, сравнительно немного. Вот их список:
Email
Envelope
Frameset
HTMLProject
LetterContent
MailMerge
MailMergeDataSource
MailMergeFields
PageSetup
Range
RoutingSlip
VBProject
WebOptions
В Office 2000 у объекта Document
появились три новых объекта в сравнении с предыдущей версией. Это объекты: Email
, Frameset
и WebOptions
.
Итак, только на верхнем уровне в объект Document
встроено около 50 объектов, определяющих его свойства. Большинство из этих объектов устроены достаточно сложно, - почти все содержат коллекции внутри себя. Попробуем упорядочить эту "тьму" объектов.
Классы, задающие структуризацию текста документа
Текст - это основа большинства документов. Его можно структурировать, оперируя различными единицами при решении тех или иных задач преобразования текста. Минимальной единицей текста является символ. Другие естественные единицы - это слова, предложения, абзацы. Более крупными частями текста являются страницы, параграфы и главы. Важно уметь оперировать с последовательностями таких единиц. Какие же классы объектов предоставляет Word для этой цели?
Классы Characters
, Words
, Statements
, Paragraphs
позволяют работать с последовательностями (коллекциями) символов, слов, предложений, абзацев. Может показаться удивительным, но классов, соответствующих таким элементам, как символ, слово или предложение, нет. Элементом коллекций Characters
, Words
и Statements
является объект класса Range
. Это один из самых важных объектов, необходимых для понимания работы с текстами. Объект Range
позволяет работать как с одним символом, так и с последовательностью символов. Документы, поддокументы, абзацы, разделы - все они имеют метод или свойство Range
, возвращающее объект Range
, представляющий область, связанную с объектом, вызвавшим метод (свойство) Range
. Эту область можно рассматривать как интервал, задаваемый первым и последним символом текста данной области. Поэтому работа с текстом, так или иначе, ведется через методы и свойства объекта Range
.
Чуть позже мы продолжим знакомство с классами Characters
, Words
, Statements
, Paragraphs
и Range
.
Документ и его части
До сих пор мы говорили только о тексте как основной части документа Word. Но документ имеет сложную структуру, и в нем можно выделить разные по назначению части. Каждой части документа, каждому понятию, определяющему эту часть, соответствует свой класс объектов, а чаще всего два класса, задающие объекты и их коллекцию. Рассмотрим основные части документа.
Разделы и поддокументы
Сейчас мы обсудим более подробно две коллекции Sections
и SubDocuments, задающие разделы документа и поддокументы, входящие в состав основного документа. Почти в каждом текстовом документе можно встретить символы, слова, предложения и абзацы. Что же касается более крупных единиц текста, то в разных документах они называются по-разному. Чаще всего, приходится встречаться со страницами и листами документа, но используются и такие термины как параграфы, главы, части, разделы документа. В объектной модели Word, к сожалению, нет таких объектов как Page
и Pages
, соответствующих таким естественным единицам текстового документа как страницы документа и их коллекции. В документе Word следующей крупной единицей после абзаца является раздел - объект класса Section
. Все разделы одного документа составляют коллекцию Sections
.
Что же такое раздел, как и для чего он создается? Раздел в документе всегда можно создать руками, для чего достаточно вставить символ разрыва документа - Section break, вызвав пункт Break из меню Insert. Символ разрыва может быть разного типа, задавая следующую страницу, четную или нечетную страницу, столбец и другие виды раздела. Таким образом, можно руками разбить документ на страницы, вставляя подходящие символы разрыва в нужных местах. В этом случае разделы будут выступать в роли страниц документа. Иногда разделы создаются автоматически, например, при представлении некоторой части документа в виде нескольких столбцов. Часть документа, представленная в виде нескольких столбцов, представляет отдельный раздел.
При программной работе разделы можно создавать двояко, используя метод InsertBreak
, которым обладают объекты Range
и Selection
, или вызывая метод Add
коллекции Sections
. Метод Add
(Range, Start) имеет два параметра:
Range
задает область, начинающую новый раздел, или, что тоже, область, перед началом которой будет вставлен символ разрыва.Start
задает тип символа разрыва.
Заметьте, в методе InsertBreak
указывается только второй параметр, поскольку новый раздел начинается с объекта Range
(Selection), вызвавшего метод.
Рассмотрим пример, в котором документ с именем DocThree, программно разбивается на разделы. Наше разбиение гарантирует, что соответствующие главы и параграфы документа находятся в отдельных разделах, что облегчает дальнейшую работу с ними. Вот как выглядит процедура, решающая эту задачу:
Листинг 1: html, txt
В этой процедуре показано, как происходит выделение раздела, подсчет некоторых характеристик раздела, например, подсчет числа абзацев, предложений и символов раздела. Показано, как создаются разделы документа, используя как метод InsertBreak
так и метод Add
коллекции Sections
. Метод Add
вызывается как с явно заданными параметрами, так и параметрами, задаваемыми по умолчанию.
Перейдем теперь к рассмотрению понятия поддокумент и способов работы с объектами, задающими поддокументы. Есть некоторый разумный предел размера одного документа. Если в документе больше 10-20 страниц, работать с ним становится неудобно. В этом случае в нем целесообразно выделить главный документ и поддокументы. Главный документ и поддокументы являются, по сути, документами, связанными ссылками, с каждым из которых можно работать независимо. Вот пример выделения поддокумента из главного документа:
Листинг 1: html, txt
Наш документ DocThree вначале не имел поддокументов. Этот документ предварительно разбивается на разделы, если это еще не было сделано, а затем в нем выделяется поддокумент, начиная с третьего раздела и кончая последним разделом документа. Метод Add
FromRange класса SubDocuments создает поддокумент, выделяя из главного документа область, заданную параметром Range
.
Заметьте, область, задаваемая параметром Range
, должна начинаться с заголовка, имеющего один из стандартных стилей Heading. При сохранении документа, поддокумент удаляется из документа и сохраняется в отдельном файле. Имя файла строится автоматически, используя текст заголовка, начинающего поддокумент. В главном документе остается ссылка на поддокумент. При желании его всегда можно слить с главным, но с ним можно работать и как с независимым документом. Вот как выглядит наш главный документ после того, как в нем выделен поддокумент:
Рис. 1.9. Главный документ с выделенным поддокументом
Назад Оглавление Вперёд