Приступаємо до роботи з проектом Word

Створюючи новий проект Office в Visual Studio. NET, ви можете вибрати
створення нового проекту Word Document або Word Template, як показано на
рис. 1.

Рис. 1. Ви можете створити в Visual Studio. NET проект Word
Document або Word Template

Visual Studio. NET автоматично створює файл коду з ім'ям
ThisDocument.vb або ThisDocument.cs в новому проекті Word Document або
Word Template. Відкрийте ThisDocument у своєму проекті. Ви побачите, що за
вас вже згенерований відкритий (public) клас OfficeCodeBehind.
Розкрийте приховану область Generated initialization code. Клас
OfficeCodeBehind
включає код, який служить оболонкою об'єктів
Word.Document
і Word.Application:

" Visual Basic
Friend WithEvents ThisDocument As Word.Document
Friend WithEvents ThisApplication As Word.Application
 
// C#
private Word.Application thisApplication = null;
private Word.Document thisDocument = null;

Наступні дві змінні оголошуються автоматично.

Наявність цих двох зумовлених змінних дозволяє легко
звертатися до даних об'єктів Word з вашого коду без оголошення
окремих об'єктів Word.Document або Word.Application
просто використовуйте ThisDocument і ThisApplication.

У наступних розділах досліджуються об'єкти Document і
Application
і детально розглядається ряд специфічних членів цих
об'єктів. Word надає дуже багату об'єктну модель, і детально
описати всі члени цієї моделі в одному документі просто неможливо. Тут
ви отримаєте уявлення про об'єктної моделі, достатню для того,
щоб приступити до роботи і в подальшому самостійно користуватися
вбудованої довідкової системою Word для більш детального вивчення
об'єктної моделі.

Рада У коді на Visual Basic. NET, представленому в цьому
документі, часто зустрічаються виклики методів CType і DirectCast.
Справа в тому, що для проекту-прикладу включений параметр Option Strict,
і Visual Basic. NET вимагає явного перетворення типів. Багато методів і
властивості об'єктів Word повертають типи Object. Наприклад,
процедурі _Startup передаються змінні з іменами application і
document і типом Object, А функція CType використовується для
їх явного перетворення в об'єкти Word.Application і
Word.Document
відповідно. Той, хто програмує на C #,
напевно оцінить це рішення. Однак, як ви потім побачите, не всі
кошти Word ідеально відповідають концепції об'єктно-орієнтованого
програмування – іноді виявляється зручніше працювати з відключеним
параметром Option Strict. Про ці винятки також буде розказано в
надалі.

Основи: документи і шаблони

Для ефективного програмування Word потрібно спочатку зрозуміти, як
працює цей додаток. У більшість операцій, які виконуються програмним
способом, є еквіваленти в інтерфейсі (UI), доступні
як команди в меню і на панелях інструментів. Також існує
нижележащих архітектура, що забезпечує підтримку команд, обираних з
UI. Одна з найважливіших концепцій – шаблони (templates). Ймовірно, ви вже
знайомі з цією концепцією: шаблон Word може містити стереотипний
текст (boilerplate text), стилі, код, панелі інструментів, комбінації
клавіш для швидкого доступу до команд і елементи автотексту (AutoText).
Всякий раз, коли ви створюєте новий документ Word, він базується на
будь-якому шаблоні; до імен файлів шаблонів додається розширення
. Dot, а до імен файлів документів -. Doc. Новий документ зв'язується з
шаблоном і отримує повний доступ до його елементів. Якщо ви не вказуєте
конкретний шаблон, новий документ створюється на основі стандартного
шаблону Normal.dot (він встановлюється при установці Word).

Інформація про Normal.dot

Шаблон Normal.dot є глобальним, він доступний будь-якого документа,
який ви створюєте. Ви могли б при бажанні помістити весь свій код в
Normal.dot і створювати всі документи в своєму середовищі на основі
власного шаблону Normal (Звичайний). Але тоді його файл міг би стати
надмірно великим, тому більш ефективне рішення для багатьох
розробників – створення власних шаблонів для конкретних програм.
У документах, що створюються на основі вашого шаблону, код із стандартного
шаблону Normal як і раніше доступний. При необхідності можна пов'язувати
документ з декількома шаблонами на додаток до шаблону Normal.

Шаблони і ваш код

Контейнерами стилів та коду можуть бути не тільки шаблони; допускається
написання коду та налаштування стилів в індивідуальних документах без
модифікації шаблону, на якому заснований документ. Виконуючи ваш код, Word
використовує повністю певну посилання (fully qualified reference) на
джерело (в ролі якого може виступати шаблон або документ), ім'я
модуля і ім'я процедури. Тут простежується аналогія з просторами
імен, що дозволяє розділяти процедури з однаковими іменами. На
рис. 2
показано діалогове вікно Customize для панелей інструментів,
ілюструє цю концепцію. Ім'я кожної процедури доповнюється іменами
модуля і проекту. У даному випадку елемент, вибраний в правій секції,
посилається на процедуру TileVertical, Яка міститься в модулі
Tile в Normal.dot. Процедура SaveDocument, Розташована відразу
під TileVertical, Міститься у проекті отделенного коду (code
behind project) активного документа.

Рис. 2. Посилання на процедури одержують повністю певні імена
при їх зв'язуванні з Toolbar

Рада Слід запам'ятати, що для документів і шаблонів у Word
завжди діє правило "самий локальний" ("most local" rule). Якщо в
Normal.dot, користувальницькому шаблоні і поточному документі дублюється
якийсь стиль, макрос або інший елемент, першим використовується той,
який знаходиться в даному документі, другим – в призначеному для користувача
шаблоні і останнім – в Normal.dot.

Стилі та форматування

Word дозволяє форматувати документ двома абсолютно різними
способами.

Зазвичай стилі застосовуються до цілого абзацу, але можна використовувати і
стилі символів (character styles), які застосовуються до окремого
символу, слову або виділеного фрагменту всередині абзацу. Щоб побачити
список стилів, виберіть Format | Styles and Formatting; На екрані
з'явиться вікно Styles and Formatting, показане на рис. 3, Де
обраний стиль абзацу Normal.

Рис. 8. Fax Wizard можна запустити викликом методу SendFax

Використання вбудованих діалогових вікон у Word

При роботі з Word час від часу виникає необхідність у
відображенні діалогових вікон для прийому користувальницького введення. Хоча ви
можете створювати свої діалогові вікна, часто зручніше користуватися
вбудованими у Word, доступ до яких відкривається через набір Dialogs
об'єкта Application. Це дозволяє звертатися більш ніж до 200
вбудованим діалоговим вікнам Word; при цьому використовуються значення
перечислимого WdWordDialog. Щоб задіяти об'єкт Dialog
в своєму коді, оголосіть його як Word.Dialog:

" Visual Basic
Dim dlg As Word.Dialog
 
// C#
Word.Dialog dlg;

Щоб вказати цікавить вас діалог Word, надайте змінної одне
зі значень, відповідне масиву доступних діалоговоих вікон:

" Visual Basic
dlg = ThisApplication.Dialogs (Word.WdWordDialog.wdDialogFileNew)
 
// C#
Dlg = ThisApplication.Dialogs [Word.WdWordDialog.wdDialogFileNew];

Створивши змінну Dialog, Ви можете використовувати її методи.
Метод Show виводить діалогове вікно так, начебто користувач
вручну вибрав його з меню Word. Наступна процедура показує
діалогове вікно File New:

" Visual Basic
Friend Sub DisplayFileNewDialog()
 Dim dlg As Word.Dialog
 dlg = ThisApplication.Dialogs( _
   Word.WdWordDialog.wdDialogFileNew)
 dlg.Show()
End Sub
 
// C#
public void DisplayFileNewDialog() 
{
 Object timeOut = Type.Missing;
 
 Word.Dialog dlg;
dlg = ThisApplication.Dialogs [Word.WdWordDialog.wdDialogFileNew];
  dlg.Show(ref timeOut);
}

Рада Метод Show приймає параметр TimeOut,
вказує число мілісекунд (мс), після закінчення яких діалогове вікно
буде автоматично закрита. У Visual Basic. NET цей параметр можна
просто проігнорувати, а в C # доведеться передати Type.Missing за посиланням,
щоб погодитися із значенням за замовчуванням (без очікування).

Ще одне ефективне застосування діалогів Word – перевірка правопису
в документі. Наступна процедура запускає засіб перевірки
правопису для активного документа, використовуючи перераховуваній значення
wdDialogToolsSpellingAndGrammar
:

" Visual Basic
Friend Sub DisplaySpellCheckDialog()
 Dim dlg As Word.Dialog
 dlg = ThisApplication.Dialogs( _
   Word.WdWordDialog.wdDialogToolsSpellingAndGrammar)
  dlg.Show()
End Sub
 
// C#
public void DisplaySpellCheckDialog() 
{
 Object timeOut = Type.Missing;
 Word.Dialog dlg;
 dlg = ThisApplication.Dialogs
  [Word.WdWordDialog.wdDialogToolsSpellingAndGrammar];
 dlg.Show(ref timeOut);
}

Методи Word.Dialog

Крім методу Show, Є ще три методи, які можна
використовувати з діалоговими вікнами Word: Display, Update і
Execute.

Модифікація значень діалогу
Через специфіку діалогових вікон Word всі властивості різних
діалогів, які відповідають значенням елементів управління на
формах, доступні тільки в період виконання. Тобто, коли Word
завантажує діалогове вікно, він створює різні властивості і додає їх
в період виконання до відповідних об'єктів. Це ускладнює
розробникам написання суворо типізованого коди (як в C # або в
Visual Basic. NET за наявності Option Strict On).
Наприклад, діалогове вікно Page Setup (репрезентована перераховуваною
значенням WdWordDialog.wdDialogFilePageSetup) Підтримує ряд
властивостей, що відносяться до налаштування параметрів сторінок, у тому числі
PageWidth
, PageHeight і т. д. Напевно, ви воліли б
писати код для доступу до цих властивостях в такому стилі:

" Visual Basic
Dim dlg As Word.Dialog
dlg = ThisApplication.Dialogs( _
  Word.WdWordDialog.wdDialogFilePageSetup)
dlg.PageWidth = 3.3
dlg.PageHeight = 6.6

На жаль, цей код просто не вдасться скомпілювати в Visual Basic. NET з
Option Strict On або в C # – властивості PageWidth і
PageHeight
залишаються невизначеними в об'єкті Dialog до
періоду виконання.

У вас є два варіанти: ви можете або створити файл на Visual Basic,
на початку якого зазначено Option Strict Off, Або піти по шляху
пізнього зв'язування. (Звичайно, ви могли б використовувати простір
імен System.Reflection і самостійно реалізувати пізніше зв'язування.)
Метод CallByName, Наданий складанням Microsoft.VisualBasic,
дозволяє вказати у вигляді рядка ім'я властивості, з яким ви хочете
взаємодіяти, а також значення цієї властивості і потрібне вам
дію. Цей метод виручить вас незалежно від того, якою мовою ви
пишете код – на Visual Basic. NET або C #. Розробникам на C #, звичайно,
доведеться додати посилання на складання Microsoft.VisualBasic, щоб
скористатися цим прийомом.

Після цього ви зможете писати приблизно такий код:

" Visual Basic
dlg = ThisApplication.Dialogs( _
  Word.WdWordDialog.wdDialogFilePageSetup)
 
CallByName(dlg, "PageWidth", CallType.Let, 3.3)
CallByName(dlg, "PageHeight", CallType.Let, 6)
 
// C#
using VB = Microsoft.VisualBasic;
 
/ / Потім всередині якоїсь процедури,:
dlg = ThisApplication.Dialogs
 [Word.WdWordDialog.wdDialogFilePageSetup];
 
VB.Interaction.CallByName(dlg, "PageWidth", 
 VB.CallType.Let, 3.3);
VB.Interaction.CallByName(dlg, "PageHeight", 
 VB.CallType.Let, 6);

Це рішення не ідеально – код важкий у написанні та сприйнятті і,
крім того, вимагає від розробників на C # користуватися методами з
Visual Basic (що може виявитися драконівським рішенням), зате воно дає
можливість працювати з інакше недоступним набором властивостей.

Проект-приклад включає процедуру, яка модифікує параметри
сторінок для поточного документа, використовуючи діалогове вікно Page Setup.
Зауважте, що цей код викликає метод Execute класу Dialog і саме вікно
ніколи не відображає, – налаштовувати великий набір властивостей таким
способом набагато простіше, ніж самостійно звертатися до безлічі
об'єктів.

" Visual Basic
using VB = Microsoft.VisualBasic;
 
Public Sub HiddenPageSetupDialog()
 Dim dlg As Word.Dialog
 dlg = ThisApplication.Dialogs( _
   Word.WdWordDialog.wdDialogFilePageSetup)
 
CallByName (dlg, "PageWidth", CallType.Let, ConvertToInches (3.3))
CallByName (dlg, "PageHeight", CallType.Let, ConvertToInches (6))
CallByName (dlg, "TopMargin", CallType.Let, ConvertToInches (0.72))
 CallByName(dlg, "BottomMargin", CallType.Let, _
   ConvertToInches(0.72))
 CallByName(dlg, "LeftMargin", CallType.Let, _
   ConvertToInches(0.66))
  CallByName(dlg, "RightMargin", CallType.Let, _
   ConvertToInches(0.66))
 CallByName(dlg, "Orientation", CallType.Let, _
   Word.WdOrientation.wdOrientPortrait)
CallByName (dlg, "DifferentFirstPage", CallType.Let, False)
 CallByName(dlg, "HeaderDistance", CallType.Let, _
   ConvertToInches(0.28))
"Використовуйте властивість ApplyPropsTo, щоб визначити,
"До чого застосовуються нові налаштування:
"0 = до цього розділу
"1 = до документа від цієї точки в напрямку вперед
"2 = до обраних розділам
"3 = до виділеного тексту
"4 = до всього документа
 CallByName(dlg, "ApplyPropsTo", CallType.Let, 0)
 dlg.Execute()
End Sub
 
Private Function ConvertToInches (ByVal value As Double) As String
  Return String.Format("{0}""", value)
End Function
 
// C#
public void HiddenPageSetupDialog()
{
 Word.Dialog dlg;
 dlg = ThisApplication.Dialogs[
  Word.WdWordDialog.wdDialogFilePageSetup];
 
VB.Interaction.CallByName (dlg, "PageWidth", VB.CallType.Let, 
  ConvertToInches(3.3));
VB.Interaction.CallByName (dlg, "PageHeight", VB.CallType.Let, 
  ConvertToInches(6));
VB.Interaction.CallByName (dlg, "TopMargin", VB.CallType.Let, 
  ConvertToInches(0.72));
VB.Interaction.CallByName (dlg, "BottomMargin", VB.CallType.Let, 
  ConvertToInches(0.72));
VB.Interaction.CallByName (dlg, "LeftMargin", VB.CallType.Let, 
  ConvertToInches(0.66));
VB.Interaction.CallByName (dlg, "RightMargin", VB.CallType.Let, 
  ConvertToInches(0.66));
VB.Interaction.CallByName (dlg, "Orientation", VB.CallType.Let, 
  Word.WdOrientation.wdOrientPortrait);
VB.Interaction.CallByName (dlg, "DifferentFirstPage", 
  VB.CallType.Let, false);
VB.Interaction.CallByName (dlg, "HeaderDistance", VB.CallType.Let, 
  ConvertToInches(0.28));
/ / Використовуйте властивість ApplyPropsTo, щоб визначити,
/ / До чого застосовуються нові налаштування:
/ / 0 = до цього розділу
/ / 1 = до документа від цієї точки в напрямку вперед
/ / 2 = до обраних розділам
/ / 3 = до виділеного тексту
/ / 4 = до всього документа
VB.Interaction.CallByName (dlg, "ApplyPropsTo", VB.CallType.Let, 
  0);
 dlg.Execute();
}
private String ConvertToInches(double value) 
{
  return String.Format("{0}"", value);
}

Рада Одиниці виміру в Word іноді призводять до плутанини. У
більшості випадків застосовуються значення в пунктах (points) (1 / 72 "), але
ви завжди можете перевизначити одиниці, передавши рядок на зразок "3" "(вона
задає три дюйми). У прикладі викликається метод ConvertToInches,
який обробляє символ лапки. Дивно те, що властивості
PageWidth
і PageHeight працюють з одиницями вимірювання,
заданими користувачем як одиниці за замовчуванням, тоді як інші
властивості в цьому прикладі вимагають або вказівки пунктів, або рядки,
містить значення – індикатор одиниці виміру. Зважаючи на це в
країнах, де використовуються дюйми, виклик ConvertToInches для перших
двох властивостей у прикладі необов'язковий. Однак, навіть якщо цей виклик
зайвий, він нічому не зашкодить.

Вирішуючи, використовувати вбудовані діалогові вікна чи ні, візьміть до
увагу свій обсяг робіт. Якщо ви налаштовуєте лише кілька властивостей
єдиного об'єкта, то, мабуть, простіше працювати з цим об'єктом
напряму. Якщо ж вам потрібно виводити UI для взаємодії з
користувачами, кращий варіант – задіяти відповідне
діалогове вікно.

Рада Якщо вам потрібні всі можливості Word-об'єкта Dialog,
однієї довідкової системи Word недостатньо. Більш докладні відомості ви
знайдете в довідковій файлі за WordBasic від Word 95. Шукайте цей файл на
www.microsoft.com за ключовими
словами "Word 95 WordBasic Help File".

Об'єкт Document

Один з основних об'єктів у програмуванні Word – Document
або його вміст. Коли ви працюєте з якимось документом в Word, він
вважається активним, і на нього можна посилатися через властивість
ActiveDocument
об'єкта Application. Всі Word-об'єкти
Document
також є членами набору Documents об'єкта
Application
; Цей набір включає всі відкриті документи. Об'єкт
Document
дозволяє працювати з єдиним документом, а набір
Documents
– З усіма відкритими документами. У класів Application
і Document багато спільних членів, тому операції над документами
можна виконувати як на рівні Application, Так і на рівні
Document
.

До найбільш поширених операцій над документами належать:

Набори об'єкта Document

Документ складається з символів, впорядкованих в слова, слова – в
пропозиції, а ті – в абзаци, які в свою чергу можуть бути
впорядковані в розділи (sections). У кожному розділі свої верхні і нижні
колонтитули (headers and footers). Об'єкт Document включає
наступні розділи:

Посилання на документи

Ви можете посилатися на об'єкт Document як на член набору
Documents
за індексом. Індекс визначає місцезнаходження об'єкта
Document
в наборі Documents, Причому індекси відлічуються від
1, як і всі набори в Word. Наступний фрагмент коду присвоює
об'єктної змінної посилання на перший об'єкт Document в наборі
Documents
:

" Visual Basic
Dim doc As Word.Document = _
  DirectCast(ThisApplication.Documents(1), Word.Document)
 
// C#
Word.Document doc = (Word.Document) ThisApplication.Documents [1];

Крім того, на документ можна посилатися на ім'я, що зазвичай зручніше,
якщо вам потрібно працювати з певним документом. Навряд чи ви будете
часто посилатися на документ за індексом, тому що це значення може
змінюватися у міру відкриття і закриття інших документів. Наступний
фрагмент коду присвоює об'єктної змінної посилання на документ по
імені MyDoc.doc:

" Visual Basic
Dim doc As Word.Document = _
DirectCast (ThisApplication.Documents ("MyDoc.doc"), Word.Document)
 
// C#
Word.Document doc = 
(Word.Document) ThisApplication.Documents ["MyDoc.doc"];

Якщо вам потрібно послатися на активний документ (документ, що знаходиться
у фокусі), використовуйте властивість ActiveDocument об'єкта
Application
. Це властивість вже створено за вас у проекті Visual Studio
. NET, тому ваш код буде ефективніше при посиланнях на активний документ
за посиланням ThisDocument. Ось приклад коду, що одержує ім'я
активного документа:

" Visual Basic
Dim str As String = ThisDocument.Name
 
// C#
String str = ThisDocument.Name;

Створення, відкриття та закриття документів

Посилання на об'єкт ThisDocument у вашому проекті Word відкриває
вам доступ до всіх членів об'єкта Document, Що дозволяє
працювати з його методами і властивостями стосовно активного
документу. Перший крок у роботі з Document – Відкриття
існуючого документа Word або створення нового.

Створення нового документа Word

Створюючи новий документ Word, ви додаєте його в набір
Documents
об'єкта Application, Де зберігаються відкриті
документи Word. Тому для створення нового документа слід викликати
метод Add. Це рівносильно клацанню кнопки New Blank Document
на панелі інструментів.

" Visual Basic
"Створення нового документа на основі Normal.dot
ThisApplication.Documents.Add()
 
// C#
/ / Створення нового документа на основі Normal.dot
Object template = Type.Missing;
Object newTemplate = Type.Missing;
Object documentType = Type.Missing;
Object visible = Type.Missing; 
 
ThisApplication.Documents.Add( 
ref template, ref newTemplate, ref documentType, ref visible);

Рада Метод Documents.Add приймає до чотирьох
необов'язкових параметрів: ім'я шаблону, ім'я нового шаблону, тип
документа і ознака видимості нового документа. У C #, щоб використовувати
значення за замовчуванням для цих параметрів, доводиться передавати
Type.Missing
за посиланням.

У методу Add є необов'язковий аргумент Template для
створення нового документа на основі шаблону, відмінного від Normal.dot. У
цьому випадку ви повинні надати повне ім'я файлу (разом зі шляхом)
цього шаблону.

" Visual Basic
"Створення нового документа на основі власного шаблону
ThisApplication.Documents.Add( _
 "C:TestMyTemplate.Dot")
 
// C#
/ / Створення нового документа на основі власного шаблону
Object template = @"C:TestMyTemplate.Dot";
Object newTemplate = Type.Missing;
Object documentType = Type.Missing;
Object visible = Type.Missing; 
 
ThisApplication.Documents.Add( 
 ref template, ref newTemplate, ref documentType, ref visible);

Цей код дає той же результат, що і при виборі File | New і
вказівці шаблону за допомогою панелі інструментів New Document. Ставлячи в
коді аргумент Template, можна бути впевненим, що всі документи будуть
створюватися на основі зазначеного шаблону.

Відкриття існуючого документа

Для цього призначений метод Open. Його базовий синтаксис
гранично простий: викликаючи Open, Ви вказуєте повний шлях та ім'я
файлу. Цей метод також приймає ряд необов'язкових аргументів,
наприклад пароль або прапор, який повідомляє, що документ повинен бути тільки
для читання. Наступний код відкриває документ, передаючи лише один з
кількох необов'язкових параметрів. Зрозуміло, в коді на C # потрібно
передавати всі параметри, але реальне значення потрібно тільки для
параметра FileName:

" Visual Basic
ThisApplication.Documents.Open("C:TestMyNewDocument")
 
// C#
Object filename = @"C:TestMyNewDocument";
Object confirmConversions = Type.Missing;
Object readOnly = Type.Missing;
Object addToRecentFiles = Type.Missing;
Object passwordDocument = Type.Missing;
Object passwordTemplate = Type.Missing;
Object revert = Type.Missing;
Object writePasswordDocument = Type.Missing;
Object writePasswordTemplate = Type.Missing;
Object format = Type.Missing;
Object encoding = Type.Missing;
Object visible = Type.Missing;
Object openConflictDocument = Type.Missing;
Object openAndRepair  = Type.Missing;
Object documentDirection = Type.Missing;
Object noEncodingDialog = Type.Missing;
 
ThisApplication.Documents.Open(ref filename, 
 ref confirmConversions, ref readOnly, ref addToRecentFiles, 
 ref passwordDocument, ref passwordTemplate, ref revert, 
 ref writePasswordDocument, ref writePasswordTemplate, 
ref format, ref encoding, ref visible, ref openConflictDocument, 
ref openAndRepair, ref documentDirection, ref noEncodingDialog);

Збереження документів

Зберігати і закривати документи можна кількома способами –
Залежно від того, якого результату ви хочете добитися. Для
збереження і закриття документа ви викликаєте методи Save і
Close
відповідно. Вони дають різні результати залежно від
того, як саме ви їх використовуєте. Якщо вони застосовуються до об'єкта
Document
, Їх дія поширюється тільки на соответствущих
документ. А якщо вони застосовуються до набору Documents – На всі
відкриті документи.