Использование Word в приложениях на Visual Basic 6 открывает широчайшие возможности для создания профессионально оформленных документов (например отчетов). Это часто необходимо при работе в фирме или на предприятии для обеспечения документооборота. Основным преимуществом использования Wordа в этом случае является то, что практически на всех компьютерах, используемых в фирмах и на предприятиях установлены Windows и пакет Microsoft Office. Поэтому подготовленные документы Word не требуют каких-либо дополнительных усилий для их просмотра, печати и редактирования. Единственное что нужно помнить, это то что работа через автоматизацию OLE (связывание и внедрение объектов) на деле оказывается довольно медленной технологией, хотя и очень полезной.
Чтобы использовать объекты Word в Visual Basic , необходимо инсталлировать сам Word. После этого вы получаете в своё распоряжение библиотеку Microsoft Word Object Library, которую нужно подключить к текущему проекту через диалоговое окно «Разработать»>>»Ссылки» (References) и указать Microsoft Word 9.0 Object Library (для Word 2000).
Два самых важных объекта Word это Word.Application и Word.Document. Они обеспечивают доступ к экземпляру приложения и документам Word.
Поэтому в раздел Generals «Общее» формы введите следующий код для объявления объектных переменных приложения Word и документа Word.
Dim WordApp As Word.Application ' экземпляр приложения Dim DocWord As Word.Document' экземпляр документа
Чтобы создать новый экземпляр Word, введите такой код кнопки;
Private Sub Комманда1_Click() 'создаём новый экземпляр Word-a Set WordApp = New Word.Application 'определяем видимость Word-a по True - видимый, 'по False - не видимый (работает только ядро) WordApp.Visible = True 'создаём новый документ в Word-e Set DocWord = WordApp.Documents.Add '// если нужно открыть имеющийся документ, то пишем такой код 'Set DocWord = WordApp.Documents.Open("C:DDD.doc") 'активируем его DocWord.Activate End Sub
Для форматирования печатной области документа используйте данный код:
(вообще-то Word использует для всех размеров своих элементов пункты, поэтому для использования других единиц измерения, необходимо использовать встроенные функции форматирования.)
Например:
- CentimetersToPoints(Х.ХХ) — переводит сантиметры в пункты.
- MillimetersToPoints(X.XX) — переводит миллиметры в пункты
Private Sub Комманда2_Click() 'отступ слева "2,0 сантиметра" DocWord.Application.Selection.PageSetup.LeftMargin = CentimetersToPoints(2) 'отступ справа "1,5 сантиметра" DocWord.Application.Selection.PageSetup.RightMargin = CentimetersToPoints(1.5) 'отступ сверху "3,5 сантиметра" DocWord.Application.Selection.PageSetup.TopMargin = CentimetersToPoints(3.5) 'отступ снизу "4,45 сантиметра" DocWord.Application.Selection.PageSetup.BottomMargin = CentimetersToPoints(4.45) End Sub
Небольшое отступление.
Для того чтобы в своём приложении не писать постоянно одно и тоже имя объекта, можно использовать оператор With.
Например код находящейся выше можно переписать так:
With DocWord.Application.Selection.PageSetup .LeftMargin = CentimetersToPoints(2) .RightMargin = CentimetersToPoints(1.5) .TopMargin = CentimetersToPoints(3.5) .BottomMargin = CentimetersToPoints(4.45) End With
Если вам необходимо создать документ Word с нестандартным размером листа, то используйте данный код:
With DocWord.Application.Selection.PageSetup .PageWidth = CentimetersToPoints(20) 'ширина листа (20 см) .PageHeight = CentimetersToPoints(25) 'высота листа (25 см) End With
Данный код меняет ориентацию страницы (практически меняет местами значения ширины и высоты листа):
DocWord.Application.Selection.PageSetup.Orientation = wdOrientLandscape
- wdOrientLandscape — альбомная ориентация ( число 1)
- wdOrientPortrait — книжная ориентация ( число 0)
Для сохранения документа под новым именем и в определенное место
используйте данный код код:
'сохраняем документ как DocWord.SaveAs "c:DDD.doc"
После такого сохранения вы можете про ходу работы с документом сохранять его.
'сохраняем документ DocWord.Save
Или проверить, были ли сохранены внесенные изменения свойством Saved и если изменения не были сохранены — сохранить их;
If DocWord.Saved=False Then DocWord.Save
Завершив работу с документом, вы можете закрыть сам документ методом Close и сам Word методом Quit.
'закрываем документ (без запроса на сохранение) DocWord.Close True 'закрываем Word (без запроса на сохранение) WordApp.Quit True 'уничтожаем обьект - документ Set DocWord = Nothing 'уничтожаем обьект - Word Set WordApp = Nothing
Если в методах Close и Quit не использовать необязательный параметр True то Word запросит согласие пользователя (если документ не был перед этим сохранён) на закрытие документа.
Если вам необходимо оставить Word открытым, просто не используйте методы Close и Quit.
Если вам необходимо поставить пароль на документ, то используйте код:
DocWord.Protect wdAllowOnlyComments, , "123456789"
Пример программы можно скачать здесь.
Создание нового документа Word или открытие существующего из кода VBA Excel. Методы Documents.Add и Documents.Open. Сохранение и закрытие документа.
Работа с Word из кода VBA Excel
Часть 2. Создание и открытие документов Word
[Часть 1] [Часть 2] [Часть 3] [Часть 4] [Часть 5] [Часть 6]
Новый документ Word создается из кода VBA Excel с помощью метода Documents.Add:
Sub Test1() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = myWord.Documents.Add myWord.Visible = True End Sub |
Переменную myDocument можно объявить с типом Object, но тогда не будет ранней привязки к типу Word.Document и подсказок при написании кода (Auto List Members).
Открытие существующего документа
Существующий документ Word открывается из кода VBA Excel с помощью метода Documents.Open:
Sub Test2() Dim myWord As New Word.Application Dim myDocument As Word.Document Set myDocument = _ myWord.Documents.Open(«C:Документ1.docx») myWord.Visible = True End Sub |
Замените в этой процедуре строку «C:Документ1.docx» на адрес своего файла.
Подключение к открытому документу
Присвоение переменной ссылки на существующий экземпляр Word.Application осуществляется в VBA Excel с помощью функции GetObject:
Sub Test3() Dim myWord As Object, myDoc As Word.Document On Error GoTo Instr Set myWord = GetObject(, «Word.Application») Set myDoc = myWord.Documents(«Документ1.docx») myDoc.Range.InsertAfter «Добавляем новый текст, подтверждающий подключение к открытому документу.» Exit Sub Instr: MsgBox «Произошла ошибка: « & Err.Description End Sub |
Если открытого приложения Word нет, выполнение функции GetObject приведет к ошибке. Также произойдет ошибка, если не будет найден указанный документ (в примере — «Документ1.docx»).
Сохранение и закрытие документа
Сохранение нового документа
Чтобы сохранить из кода VBA Excel новый документ Word, используйте метод SaveAs2 объекта Document:
myDocument.SaveAs2 («C:Документ2.docx») |
Замените «C:Документ2.docx» на путь к нужному каталогу с именем файла, под которым вы хотите сохранить новый документ.
Сохранение изменений в открытом документа
Сохраняйте изменения в существующем документе с помощью метода Document.Save или параметра SaveChanges метода Document.Close:
‘Сохранение изменений документа myDocument.Save ‘Сохранение изменений документа ‘при закрытии myDocument.Close ‘по умолчанию True myDocument.Close True myDocument.Close wdSaveChanges ‘Закрытие документа без ‘сохранения изменений myDocument.Close False myDocument.Close wdDoNotSaveChanges |
Закрытие любого сохраненного документа
Метод Document.Close закрывает документ, но не приложение. Если работа с приложением закончена, оно закрывается с помощью метода Application.Quit.
Большинству операций, выполняемых программным способом, есть эквиваленты в пользовательском интерфейсе (UI), доступные как команды в меню и на панелях инструментов. Также существует нижележащая архитектура, обеспечивающая поддержку команд, выбираемых из UI. Всякий раз, когда вы создаете новый документ Word, он базируется на каком-либо шаблоне; расширение файлов шаблонов «.dot», а файлы документов – «.doc». Шаблон Word может содержать текст, код, стили, панели инструментов, элементы автотекста, комбинации клавиш для быстрого доступа к командам. Новый документ связывается с шаблоном и получает полный доступ к его элементам. Если вы не указываете конкретный шаблон, новый документ создается на основе стандартного шаблона «Normal.dot», который устанавливается при установке Word).
Шаблон Normal.dot является глобальным, он доступен любому документу, который вы создаете. Вы могли бы при желании поместить весь свой код в Normal.dot и создавать все документы в своей среде на основе собственного шаблона Normal (Обычный). Но тогда его файл мог бы стать чрезмерно большим, поэтому более эффективное решение для многих разработчиков — создание собственных шаблонов для конкретных приложений. В документах, создаваемых на основе вашего шаблона, код из стандартного шаблона Normal по-прежнему будет доступен. При необходимости можно связывать документ с несколькими шаблонами в дополнение к шаблону Normal.
Для работы с приложением Microsoft Word в .NET, используется объект Application, который является предком всех остальных объектов. Получив на него ссылку, вы можете работать с его методами и свойствами. Этот объект предоставляет большой набор методов и свойств, позволяющих программным путем управлять Microsoft Word. Код инициализации нового объекта Application, представлен ниже.
Microsoft.Office.Interop.Word.Application winword = new Microsoft.Office.Interop.Word.Application();
Чтобы открыть существующий документ или создать новый, необходимо создать новый объект Document.
object missing = System.Reflection.Missing.Value; Microsoft.Office.Interop.Word.Document document = winword.Documents.Add(ref missing, ref missing, ref missing, ref missing);
Выполняя какую-либо операцию в пользовательском интерфейсе Word (например, добавляя верхний колонтитул), вы выделяете соответствующую секцию, используя объект «Selection», определяющий текущую позицию «невидимого» курсора и применяете к ней новый параметр форматирования с использованием объекта «Range». Данный объект представляет область в документе и может включать в себя все что угодно — от пары символов, до таблиц, закладок и много другого. Вы не ограничены одним объектом «Range» — в одном документе можно определить сразу несколько таких объектов.
//Добавление верхнего колонтитула foreach (Microsoft.Office.Interop.Word.Section section in document.Sections) { Microsoft.Office.Interop.Word.Range headerRange = section.Headers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; headerRange.Fields.Add(headerRange, Microsoft.Office.Interop.Word.WdFieldType.wdFieldPage); headerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; headerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdBlue; headerRange.Font.Size = 10; headerRange.Text = "Верхний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com"; } //Добавление нижнего колонтитула foreach (Microsoft.Office.Interop.Word.Section wordSection in document.Sections) { Microsoft.Office.Interop.Word.Range footerRange = wordSection.Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; footerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdDarkRed; footerRange.Font.Size = 10; footerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; footerRange.Text = "Нижний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com"; }
Чтобы добавить текст в документ, необходимо указать позицию для вставки и сам текст.
//Добавление текста в документ document.Content.SetRange(0, 0); document.Content.Text = "www.CSharpCoderR.com" + Environment.NewLine;
Так же вы можете применить к тексту определенный стиль.
//Добавление текста со стилем Заголовок 1 Microsoft.Office.Interop.Word.Paragraph para1 = document.Content.Paragraphs.Add(ref missing); object styleHeading1 = "Заголовок 1"; para1.Range.set_Style(styleHeading1); para1.Range.Text = "Исходники по языку программирования CSharp"; para1.Range.InsertParagraphAfter();
В классе Microsoft.Office.Interop.Word.Document, присутствует коллекция «Tables», которая позволяет добавить таблицу в документ с использованием метода Add.
//Создание таблицы 5х5 Table firstTable = document.Tables.Add(para1.Range, 5, 5, ref missing, ref missing); firstTable.Borders.Enable = 1; foreach (Row row in firstTable.Rows) { foreach (Cell cell in row.Cells) { //Заголовок таблицы if (cell.RowIndex == 1) { cell.Range.Text = "Колонка " + cell.ColumnIndex.ToString(); cell.Range.Font.Bold = 1; //Задаем шрифт и размер текста cell.Range.Font.Name = "verdana"; cell.Range.Font.Size = 10; cell.Shading.BackgroundPatternColor = WdColor.wdColorGray25; //Выравнивание текста в заголовках столбцов по центру cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter; cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; } //Значения ячеек else { cell.Range.Text = (cell.RowIndex - 2 + cell.ColumnIndex).ToString(); } } }
Для функционирования описанного выше кода, необходимо добавить к текущему проекту объектную библиотеку MS Word. Перейдите в меню «Проект» и выберете команду «Добавить ссылку» или в обозревателе решений, найдите пункт «Ссылки» и сделайте клик правой клавишей мыши по нему, из появившегося контекстного меню выберете соответствующий пункт.
В открывшемся окне «Добавить ссылку», перейдите на вкладку «COM» и выберете «Microsoft Word 14.0 Object Library» из предложенного списка библиотек.
В обозревателе решений у вас появится ссылка на данную библиотеку.
Перейдите в конструктор главной формы и добавьте из панели элементов, командную кнопку «Button». Данный элемент необходим для запуска процесса создания документа и вызов MS Word для отображения.
Сделайте двойной клик левой клавишей мыши по элементу «Button» и вы перейдете в автоматически созданный метод события «button1_Click». Добавьте в него приведенный ниже код.
try { Microsoft.Office.Interop.Word.Application winword = new Microsoft.Office.Interop.Word.Application(); winword.Visible = false; //Заголовок документа winword.Documents.Application.Caption = "www.CSharpCoderR.com"; object missing = System.Reflection.Missing.Value; //Создание нового документа Microsoft.Office.Interop.Word.Document document = winword.Documents.Add(ref missing, ref missing, ref missing, ref missing); //добавление новой страницы //winword.Selection.InsertNewPage(); //Добавление верхнего колонтитула foreach (Microsoft.Office.Interop.Word.Section section in document.Sections) { Microsoft.Office.Interop.Word.Range headerRange = section.Headers[ Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; headerRange.Fields.Add( headerRange, Microsoft.Office.Interop.Word.WdFieldType.wdFieldPage); headerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; headerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdBlue; headerRange.Font.Size = 10; headerRange.Text = "Верхний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com"; } //Добавление нижнего колонтитула foreach (Microsoft.Office.Interop.Word.Section wordSection in document.Sections) { // Microsoft.Office.Interop.Word.Range footerRange = wordSection.Footers[Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary].Range; //Установка цвета текста footerRange.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdDarkRed; //Размер footerRange.Font.Size = 10; //Установка расположения по центру footerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter; //Установка текста для вывода в нижнем колонтитуле footerRange.Text = "Нижний колонтитул" + Environment.NewLine + "www.CSharpCoderR.com"; } //Добавление текста в документ document.Content.SetRange(0, 0); document.Content.Text = "www.CSharpCoderR.com" + Environment.NewLine; //Добавление текста со стилем Заголовок 1 Microsoft.Office.Interop.Word.Paragraph para1 = document.Content.Paragraphs.Add(ref missing); object styleHeading1 = "Заголовок 1"; para1.Range.set_Style(styleHeading1); para1.Range.Text = "Исходники по языку программирования CSharp"; para1.Range.InsertParagraphAfter(); //Создание таблицы 5х5 Table firstTable = document.Tables.Add(para1.Range, 5, 5, ref missing, ref missing); firstTable.Borders.Enable = 1; foreach (Row row in firstTable.Rows) { foreach (Cell cell in row.Cells) { //Заголовок таблицы if (cell.RowIndex == 1) { cell.Range.Text = "Колонка " + cell.ColumnIndex.ToString(); cell.Range.Font.Bold = 1; //Задаем шрифт и размер текста cell.Range.Font.Name = "verdana"; cell.Range.Font.Size = 10; cell.Shading.BackgroundPatternColor = WdColor.wdColorGray25; //Выравнивание текста в заголовках столбцов по центру cell.VerticalAlignment = WdCellVerticalAlignment.wdCellAlignVerticalCenter; cell.Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; } //Значения ячеек else { cell.Range.Text = (cell.RowIndex - 2 + cell.ColumnIndex).ToString(); } } } winword.Visible = true; } catch (Exception ex) { MessageBox.Show(ex.Message); }
Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Нажмите на единственную кнопку, расположенную на главной форме вашего проекта. У вас автоматически откроется документ Microsoft Word с заполненным верхним и нижним колонтитулом, обычным и с применением стиля текстом, а так же заполненной таблицей.
Для сохранения документа в определенной директории, добавьте приведенный ниже код, после строки «winword.Visible = true;».
//Сохранение документа object filename = @"d:temp1.docx"; document.SaveAs(ref filename); //Закрытие текущего документа document.Close(ref missing, ref missing, ref missing); document = null; //Закрытие приложения Word winword.Quit(ref missing, ref missing, ref missing); winword = null;
При работе с приложением Word в памяти компьютера создается отдельный процесс, если его не закрыть или не вывести созданный документ на экран, то он будет работать до выключения компьютера. Так же при постоянной работе с такими документами, их процессы будут накапливаться незаметно для пользователя, что может привести к зависанию компьютера или другим последствиям.
В этом примере показано, как заставить C# создать документ Word. Сначала откройте диалоговое окно «Добавить ссылки». На вкладке COM выберите «Библиотека объектов Microsoft Word 14.0» (или любую другую версию, установленную в вашей системе).
Добавьте следующий с помощью оператора, чтобы упростить работу с пространством имен Word. Часть Word = означает, что вы можете использовать Word как псевдоним для пространства имен.
using Word = Microsoft.Office.Interop.Word;
В этом примере используется следующий код для создания нового документа Word и добавления в него текста.
// Создаем документ Word.
private void btnGo_Click (отправитель объекта, EventArgs e)
{
// Получить объект приложения Word.
Word._Application word_app = new Word.ApplicationClass ();// Сделать Word видимым (необязательно).
word_app.Visible = true;// Создаем документ Word.
object missing = Type.Missing;
Word._Document word_doc = word_app.Documents.Add (
ref missing, ref missing, ref missing, ref missing);// Создаем абзац заголовка.
Word.Paragraph para = word_doc.Paragraphs.Add (ref missing);
para.Range.Text = "Кривая хризантемы";
object style_name = "Заголовок 1";
para.Range.set_Style (ref style_name);
para.Range.InsertParagraphAfter ();// Добавить текст.
para.Range.Text = «Сделать кривую хризантемы» +
«используйте следующие параметрические уравнения, когда t идет» +
"от 0 до 21 *? для генерации" +
«точки, а затем соединить их»;
para.Range.InsertParagraphAfter ();// Сохраним текущий шрифт и начнем с использования Courier New.
string old_font = para.Range.Font.Name;
para.Range.Font.Name = "Courier New";// Добавим уравнения.
para.Range.Text =
"r = 5 * (1 + Sin (11 * t / 5)) - n" +
«4 * Sin (17 * t / 3) ^ 4 * n" +
«Sin (2 * Cos (3 * t) - 28 * t) ^ 8 n" +
"x = r * Cos (t) n" +
"y = r * Sin (t)";// Начнем новый абзац, а затем
// вернемся к исходному шрифту.
para.Range.InsertParagraphAfter ();
para.Range.Font.Name = old_font;// Сохраним документ.
object filename = Path.GetFullPath (
Path.Combine (Application.StartupPath, ".. \ ..")) +
"\ test.doc";
word_doc.SaveAs(ref filename, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing,
ref missing);// Закрыть.
object save_changes = false;
word_doc.Close (ref save_changes, ref missing, ref missing);
word_app.Quit (ref save_changes, ref missing, ref missing);
}
…
В этом примере видится сервер Word. В реальном приложении вы можете захотеть сохранить его скрытым.
Объектная модель Word использует множество вызовов методов, которые по какой-то причине принимают множество параметров по ссылке, даже если они не изменяются методами. Это означает, что вы должны поместить значения для этих параметров в переменные. Например, вы не можете использовать true как логический параметр, потому что вы не можете передавать константу по ссылке. Аналогично, вы не можете использовать литеральную строку, такую как C: wherever test.doc для имени файла, который вы открываете, потому что это не назначаемая переменная.
Код создает специальную переменную с именем missing, которая имеет значение Type.Missing. Код может использовать это значение для любых необязательных параметров, которые ему не нужно передавать методам Word. Затем программа использует его при вызове вызова Documents.Add сервера Word, который создает новый документ Word.
Теперь программа начинает добавлять текст в документ. Он добавляет объект Paragraph к коллекции документа Paragraphs.
Одним из наиболее важных объектов в Word является Range. A Диапазон представляет собой кусок документа. Код устанавливает текст нового абзаца в «Кривую хризантемы». Затем он устанавливает стиль объекта Range в «Заголовок 1.». Снова обратите внимание на нечетный способ, которым он должен поместить значение в переменную перед вызовом set_Style, чтобы он мог передавать имя стиля по ссылке.
Затем код вызывает метод Range объекта InsertParagraphAfter. Это добавляет метку абзаца после текущего текста объекта Range и обновляет Range, чтобы перейти к новому абзацу. Теперь Range готов добавить больше текста после первого абзаца.
Код снова устанавливает текст объекта Range для добавления нового текста и вызовов InsertParagraphAfter снова.
Далее код добавляет некоторый текст, отформатированный как код с шрифтом Courier New. Он сохраняет имя текущего шрифта и устанавливает шрифт объекта Range в Courier New. С этого момента новый текст будет иметь этот шрифт.
Код снова устанавливает текст объекта Range и добавляет новый знак абзаца. Затем он восстанавливает исходное имя шрифта, поэтому будущий текст будет в исходном шрифте.
Затем код вызывает метод SaveAs документа Word для сохранения нового документа. Это перезаписывает любой существующий файл с этим именем без предупреждения. Если вы хотите убедиться, что файл еще не существует, используйте File.Exists для проверки.
Наконец, код закрывает документ Word и приложение Word.
Источник: http://csharphelper.com/blog/2014/11/create-a-word-document-in-c/
Наконец то я смогу написать статью с примерами. Дело в том, что ключевым компонентом объектной модели Word является не сам объект Word.Application, а коллекция Documents, так как именно она предоставляет два ключевых метода – для создания и открытия документа Word. Конечно, у коллекции Word Documents есть и другие методы и свойства, но они не столь важны. И поэтому, мы рассмотрим только самые основные.
Сама по себе коллекция Documents хранит в себе набор всех объектов Document, которые в свою очередь позволяют работать с каждым экземпляром документа в отдельности. Я буду приводить примеры как в самом редакторе VBA, как и с помощью сценариев Windows Scrip Host.
Единственно свойство, которое позволяет узнать общее количество элементов коллекции является Count:
Count – содержит количество открытых в данный момент документов.
Для примера, откройте несколько word документов и в редакторе VBA пропишите следующий код (просто создайте новый модуль):
For Each objDoc In Documents DocName = DocName & objDoc.Name & vbCrLf Next MsgBox DocName DocName = "" For j = 1 To Documents.Count DocName = DocName & Documents.Item(j).Name & vbCrLf Next MsgBox DocName
В данном случае мы использовали два способа бля работы с коллекцией:
- Использовали цикл for each для обработки коллекции
- Использовали свойство count для определения количества элементов в коллекции Documents.
Оба способа позволяют получить имена всех документов открытых в данный момент.
Однако, если мы попробуем проделать аналогичный фокус в сценарии Windows script Host, то никакого результата не получим:
' ----------------------------------------------------- ' Получение имени открытых документов ' documents-count.vbs ' ----------------------------------------------------- Option Explicit dim objWord, objDoc, oDoc, DocName Set objWord = CreateObject("Word.Application") Set objDoc = objWord.Documents For Each oDoc In objDoc DocName = DocName & oDoc.Name & vbCrLf Next MsgBox DocName objWord.Quit
// ------------------------------------------------ // Получение имени открытых документов // documents-count.js // ------------------------------------------------ var objWord, objDoc, oDoc, DocName; objWord = WScript.CreateObject("Word.Application"); objDoc = new Enumerator(objWord.Documents); for (; !objDoc.atEnd(); objDoc.moveNext()){ DocName += objDoc.item().Name+ "n"; } WScript.Echo(DocName); objWord.Quit();
Видимо из внешнего сценария мы можем обработать только ту коллекцию, которую создали тут же.
Методы коллекции Word Documents
Хорошо, теперь давайте рассмотрим некоторые методы коллекции Word Documents, один из методов мы уже использовали выше (Item).
Add(Template, NewTemplate, DocumentType, Visible) – отвечает за создание нового документа, который сразу же открывается, можно выполнить метод без параметров. Параметры:
- Template – задает шаблон для нового документа
- NewTemplate – определяет, сделать ли новый документ шаблоном (TRUE) или нет (FALSE)
- DocumentType – позволяет задать тип создаваемого документа, возможные значения: wdNewBlankDocument, wdNewEmailMessage, wdNewFrameset или wdNewWebPage (новый чистый документ, значение по умолчанию).
- Visible – видимость нового документа (TRUE или FALSE).
При отсутствии параметров, будет создан чистый документ на основе шаблона Normal.dot.
Обратите внимание, что свойство Visible есть и у объекта Word Application, там оно позволяет показать или скрыть все экземпляры объекта Application.
Ниже привожу пример, сценария, в котором создается пять документов, выводится их количество и далее они закрываются:
' -------------------------------------------- ' Создание документов word ' Application Documents Word ' documents-add-word. ' -------------------------------------------- Option Explicit dim objWord, objDoc, i ' Создаем ссылку на объект Word.Application Set objWord = CreateObject("Word.Application") ' Создаем ссылку на объект Documents Set objDoc = objWord.Documents ' Делаем видимым приложение Word objWord.Visible = True ' Создаем пять документов for i=1 to 5 objDoc.Add Next ' Выводим количество созданных документов MsgBox "Количество документов " & objDoc.Count 'Закрываем все документы Word objWord.Quit
// -------------------------------------------- // Создание документов word // Application Documents Word // documents-add-word.js // -------------------------------------------- var objWord, objDoc, i; // Создаем ссылку на объект Word.Application objWord = WScript.CreateObject("Word.Application"); // Создаем ссылку на объект Documents objDoc = objWord.Documents; // Делаем видимым приложение Word objWord.Visible = true; // Создаем пять документов for (i=1; i<=5; i++){ objDoc.Add(); } // Выводим количество созданных документов WScript.Echo ("Количество документов " + objDoc.Count); //Закрываем все документы Word objWord.Quit()
Item(index) переход к заданному элементу коллекции по его индексу. Значение индекса можно задавать как через метод, так и через коллекцию, так как метод Item используется по умолчанию. Следующие две строки кода являются эквивалентными:
Application.Documents(3) Application.Documents.Item(3)
' ------------------------------------------- ' Обработка коллекции документов ' Application Documents Word ' documents-count-word.vbs ' ------------------------------------------- Option Explicit dim objWord, objDoc, i, j, objInfo ' вызываем процедуру CreateDoc Call CreateDoc objInfo = "Имя:" & vbCrLf ' Начинаем перебор коллекции Documents for j=1 to objDoc.Count objInfo = objInfo & objDoc.Item(j).Name & vbCrLf Next ' Выводим имена созданных документов MsgBox objInfo 'Закрываем все документы Word objWord.Quit Sub CreateDoc Set objWord = CreateObject("Word.Application") Set objDoc = objWord.Documents objWord.Visible = True for i=1 to 5 objDoc.Add Next End Sub
// ----------------------------------------- // Обработка коллекции документов // Application Documents Word // documents-count-word.js // ----------------------------------------- var objWord, objDoc, i, j, objInfo CreateDoc() objInfo = "Имя:n"; // Начинаем перебор коллекции Documents for (j=1; j<=objDoc.Count; j++){ objInfo += objDoc.Item(j).Name + "n"; } // Выводим имена созданных документов WScript.Echo(objInfo); //Закрываем все документы Word objWord.Quit() function CreateDoc(){ objWord = WScript.CreateObject("Word.Application"); objDoc = objWord.Documents; objWord.Visible = true; for (i=1; i<=5; i++){ objDoc.Add(); } }
Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format) – открыть заданный документ
- FileName – только этот параметр является обязательным, содержит путь к файлу, если надо открыть несколько документов, то имена разделяются пробелами.
- ConfirmConversions – содержит логическое значение, определяющее, надо ли отображать (TRUE) или нет (FALSE) отображать диалоговое окно Convert File, если документ записан не в формате Word.
- ReadOnly – определяет, открывать ли документ только для чтения (значение TRUE).
- AddToRecentFiles – если значение TRUE, то документ добавляется к списку файлов внизу меню Файл.
- PasswordDocument, PasswordTemplate – пароль к документу или пароль к шаблону, соответственно. Application Documents Word.
- Revert – если данный параметр содержит значение TRUE, то при попытке открыть уже открытый документ, сделанные в нем изменения не будут сохраняться. Если значение FALSE – произойдет простая активизация документа.
- WritePasswordDocument – пароль, который запрашивается при сохранении документа.
- WritePasswordTemplate — пароль, который запрашивается при сохранении шаблона.
- Format – параметр содержит параметр для преобразования файла. Значения: wdOpenFormatAuto (по умолчанию), wdOpenFormatDocument, wdOpenFormatRTF, wdOpenFormatTemplate, wdOpenFormatText, wdOpenFormatUnicodeText.
Save() и Close() – сохранение и закрытие (соответственно) всех документов в заданной коллекции.
Word add-in development in Visual Studio: Application and base objects
Posted on Monday, July 8th, 2013 at 7:08 am by .
Microsoft Word has tons of objects and is a bit underrated when it comes to building Office solutions. My opinion is this is due to the attention Outlook and Excel receive… and rightfully so. But Word is just as powerful as its siblings, if not more so.
In this article (the first in a series of Word development topics), I’ll cover Microsoft Word application and base objects. And, as is our tradition, I’ll provide relevant code samples for Word 2013 – 2000 you can copy and paste into your solutions. You have my permission (otherwise it would be stealing).
- Word base objects
- Accessing base objects with code
- Useful events
Word’s base objects
- Application – The Word application itself. The mother ship… without her we don’t have Word.
- Document – A Word document… I know, almost needs no explanation.
- Selection – The currently selected content in a document. This one is tricky because it can also be the insertion point.
As you can see in the diagram to the right (which I lifted straight off MSDN), everything else resides beneath these three guys.
Today, we will focus on these three and save all the other hangers-on for another day.
Accessing base objects with code
Learning to work with the base objects is the 20% that empowers you to do 80% of what’s needed to make things happen. I’m going to do this in alphabetical order today. Let’s get to the code samples.
The Application object
This sample shows how to change some Word application-level settings. Add-in Express provides the WordApp within our AddinModule for easy access to the Word application.
Public Sub SetMyWordApplicationPreferences() WordApp.DisplayRecentFiles = True WordApp.RecentFiles.Maximum = 1 WordApp.DisplayScreenTips = False WordApp.DisplayScrollBars = True WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone WordApp.WindowState = Word.WdWindowState.wdWindowStateMaximize WordApp.ActiveWindow.View.ReadingLayout = False End Sub
This routine clears Word just a little bit of distractions and prepares the serious writer for some serious writing. It reduces the recent files list to a single file, turns off screen tips and alerts. It also maximizes the Word window and turns off the reading layout. Ahh… now I’m ready to… ready to do some serious writing.
The Document object
Microsoft Word exists for users to author documents. It stands to reason, therefore, that the majority of the samples today are document focused.
Enumerate documents
Word has a documents collection that provides access to all open documents. Using the documents collection, you can do what you want with them (assuming the API supports it that is).
Public Sub EnumerateDocumentsAndCloseWithoutSaving() Dim docs As Word.Documents = Nothing docs = WordApp.Documents For i As Integer = docs.Count To 1 Step -1 docs(i).Close(Word.WdSaveOptions.wdDoNotSaveChanges) Next Marshal.ReleaseComObject(docs) End Sub
Here, I wanted to close all the documents and not save them.
Create a new Word document
To create a new word document, you need to add a new document to the Documents collection.
Public Sub CreateNewDocument(docName As String) Dim newDoc As Word.Document = Nothing newDoc = WordApp.Documents.Add() newDoc.SaveAs2(docName) Marshal.ReleaseComObject(newDoc) End Sub
In the above sample, I go the extra trouble of saving the document using the passed docName.
Create a new document from a template
To create new document based on a template, you do the same thing as we just did except you provide the path to the document template.
Public Sub CreateNewDocumentFromTemplate(templatePath As String) Dim newDoc As Word.Document = Nothing newDoc = WordApp.Documents.Add(templatePath) Marshal.ReleaseComObject(newDoc) End Sub
It’s easy but your users will believe it to be magic. And it is.
Open an existing document
To open a document you can call the Open method of the Documents collection and specify the path to the file you want to open.
Public Sub OpenDocument(docPath As String) Dim doc As Word.Document = Nothing doc = WordApp.Documents.Open(docPath) 'or 'doc = WordApp.Documents.Add(docPath) Marshal.ReleaseComObject(doc) End Sub
You can also just add it to the documents collection.
The Selection object
There is always a selection in Word. Either there is selected content or there is an insertion point (meaning, no content is selected and we are ready to add content. This object provides quick access to the content that is the current focus of the user’s attention.
Private Sub ChangeSelectionFontAndCountWords() Dim selection As Word.Selection = Nothing selection = WordApp.Selection selection.Font.Name = "Arial" selection.Font.Size = 16 MessageBox.Show( _ selection.Words.Count, "Selection Word Count", _ MessageBoxButtons.OK, MessageBoxIcon.Information) Marshal.ReleaseComObject(selection) End Sub
This method changes the font and size of the text in the Selection object. It then displays the Word count in a message box.
Useful events
Working with the base objects and bending them to your will is one thing. Responding to events when they try to sneak away is another. When you combine the two, well, you are close to building some useful solutions.
NewDocument event
Don’t let the name of this event fool you. This event is a Word application event that executes when Microsoft Word creates a new document. It is the place for any setup logic you want to execute against a new document.
Private Sub adxWordEvents_NewDocument(sender As Object, hostObj As Object) _ Handles adxWordEvents.NewDocument Dim doc As Word.Document = Nothing doc = TryCast(hostObj, Word.Document) doc.BuiltInDocumentProperties("Author") = "Me" End Sub
This hostObj is the newly created document. By casting to a Document, I then access the built-in properties and set the Author property.
DocumentOpen event
I really like to see the Navigation Pane when I work with documents. If it is not visible, I immediately click the View tab and enable it. But that’s silly. Why not have some code to do it for me?
Private Sub adxWordEvents_DocumentOpen(sender As Object, hostObj As Object) _ Handles adxWordEvents.DocumentOpen WordApp.ActiveWindow.DocumentMap = True End Sub
This DocumentOpen event executes anytime Word opens a document. Thus, it is the event to respond to and automatically display the navigation pane (aka the DocumentMap)
DocumentBeforePrint event
Does anyone besides accountants and lawyers print documents these days? Heck, anytime I think about printing a document I receive, I feel guilty because lots of people have email signatures that include the phrase “Think before you print.” The DocumentBeforePrint is a good event for doing some last minute checking with the user as it executes right before sending the document to the printer.
Private Sub adxWordEvents_DocumentBeforePrint(sender As Object, _ e As ADXHostBeforeActionEventArgs) _ Handles adxWordEvents.DocumentBeforePrint 'At least think about being green before printing If MessageBox.Show( _ "Do you really want to print the document and contribute to the killing of a few _ trees?", "Think Before You Print", MessageBoxButtons.YesNo) = DialogResult.No Then e.Cancel = True End If End Sub
If the user clicks No, the method sets Cancel=True to cancel the print job. Otherwise, the print continues and a few trees are killed. Oh well, they’ll grow back I suppose. Another good use of this event is to automatically route print jobs to different printers depending on the logic of your choosing.
DocumentBeforeClose event
This event executes right before Word closes the document. It’s a good event for cleaning up the document.
Private Sub adxWordEvents_DocumentBeforeClose(sender As Object, _ e As ADXHostBeforeActionEventArgs) Handles adxWordEvents.DocumentBeforeClose Dim doc As Word.Document = Nothing doc = TryCast(e.HostObject, Word.Document) If doc.Comments.Count > 1 Then If MessageBox.Show( _ "This documents contains comments, do you really want to close it?", _ "Respond to Comments?", MessageBoxButtons.YesNo) = DialogResult.No Then e.Cancel = True End If End If End Sub
In this example, I reference the HostObject of the passed ADXHostBeforeActionEventArgs object. I do it because HostObject is the document that’s closing. After I recast it as a Document, I check for comments and alert the user to them and give them a chance to reconsider.
Application.Quit event
The Quit event is the place for doing some clean-up.
Private Sub adxWordEvents_Quit(sender As Object, e As EventArgs) _ Handles adxWordEvents.Quit 'Clear the recent docs list While WordApp.RecentFiles.Count > 0 WordApp.RecentFiles.Item(1).Delete() End While End Sub
Continuing my theme of removing distractions, this sample removes all recent files. The NSA can’t track this! Notice that I do not up the count in the loop and always access WordApp.RecentFiles.Item(1). The reason is that each Delete action lowers the count in the RecentFiles collection. Thus, by calling Item(1) each time, I can safely delete each item.
***
Okay, there you go… that’s Word Application and Base Objects 101. This is enough information and samples to get you started. But, it’s also enough to make you thirst for more. You will not thirst for long as we have a whole series of Beginning Word Development topics set for this month.
Available downloads:
This sample Outlook add-in was developed using Add-in Express for Office and .net:
VB.NET sample Word add-in
You may also be interested in:
- Creating add-ins for Microsoft Word and Excel(C#, VB.NET)
- Sample Word addin (C#, VB.NET) with source code
Word add-in development in Visual Studio for beginners:
- Part 2: Customizing Word UI – What is and isn’t customizable
- Part 3: Customizing Word main menu, context menus and Backstage view
- Part 4: Creating custom Word ribbons and toolbars
- Part 5: Building custom task panes for Word 2013 – 2003
- Part 6: Working with Word document content objects
- Part 7: Working with Word document designs, styles and printing
- Part 8: Working with multiple Microsoft Word documents
- Part 9: Using custom XML parts in Word add-ins
- Part 10: Working with Word document properties, bookmarks, content controls and quick parts
- Part 11: Populating Word documents with data from external sources
- Part 12: Working with Microsoft Word templates