Приступаємо до роботи з проектом Word,. NET Framework, ASP, статті

Створюючи новий проект 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 – На все відкриті документи.