Перейти к содержимому

Как подключить word к visual studio

  • автор:

VSTO и CAB: Интеграция .NET приложения в Microsoft Word

VSTO расшифровывается как Visual Studio Tools for Office. Эти средства позволяют довольно легко скрещивать ужа с ежом — писать .NET приложения, исполняемые CLR в среде Microsoft Office. В частности, программисты обладают возможностью создавать подключаемые модули (плагины) и «кастомизированные» шаблоны для документов почти ко всему основному семейству продуктов Microsoft Office.

В статье приведена инфраструктура Windows Forms проекта, в котором Microsoft Word воспринимается приложением в качестве шелла. В статье раскрыты несколько интересных моментов использования Composite UI Application Block, в частности подключение инфраструктуры доменной модели Word в сервисам расширения каркаса, а так же приведены некоторые факты и особенности разработки с использованием средств VSTO.

Задача

Предположим, у нас есть несколько десятков людей, которые пишут документы и постоянно работают с их редакциями. Sharepoint и другие порталы по каким-то причинам не подходят, поэтому требуется реализация собственной бизнес-логики. Усложним задачу — люди работают в области, очень далекой от компьютерной тематики и хорошо знают только пакет Microsoft Office. Еще усложним — контора бедная, Microsoft Office у большинства народа версии 2003-ей. Кое где, у больших начальников и Главного босса стоит 2007ой. Парк машин разнородный — начиная от 2000-ой винды и до Windows Vista.

Решение

Одним из решений является плагин для Microsoft Office. Его можно написать на COM-е, через голый Office Interop, или же через такой же интероп, но по хитрому обернутый в средства VSTO. Эти средства и задействуем. Пользователь будет запускать Word, среда исполнения VSTO будет подцеплять сборки .NET и каким-то образом дополнять элементы управления Microsoft Word, позволяя пользователю выполнить нужную в задаче бизнес-логику.

А к чему все это?

(Это кому не терпиться узнать, чем все закончится). На выходе я выложу Visual Studio solution, который позволит в полпинка создать свое приложение, подключаемое в Microsoft Word. По ходу дела я объясню практически все, что и как в этом солюшене используется.

Что потребуется для работы
  1. Microsoft Word 2003 SP3
  2. VSTO 2005 SE
  3. VSTO 2005 SE Runtime
  4. CAB
  5. Visual Studio 2005 или 2008
Зачем CAB?

Для того, чтобы определить явное разделение функционала, связанного с Microsoft Word от простой Windows Forms логики. Проще говоря, наш плагин будет являться модулем CAB, и при желании, мы легко сможем подключить эту логику в другие приложения CAB. Еще проще говоря, использование CAB минимизирует количество glue-кода.

Есть еще две причины, по которым я включил CAB в решение. Первая состоит в том, что я уже давал описание этого каркаса здесь, а теперь хочу привести полноценный работающий пример. Вторая причина более банальная — мне нравится CAB, он делает мир и вещи в нем проще:)

Подробнее про VSTO

Вообще говоря, VSTO не только плагины для Word-а умеет создавать. Это мощная система, сейчас она уже есть в третьей версии. VSTO — это врата для разработчика в мир автоматизации и программирования Office-based решений. В двух словах — разработчик .NET получает доступ к доменной модели приложения Office и делает с ней что хочет.

  1. Уровень документа (Document Level Customization)
  2. Уровень приложения (Application Level Customization)

Application Level Customization означает то, что в среду приложения Microsoft Office подключается модуль расширения (т.н. add-in). Собственно, про него я изначально и начал говорить. Этот модуль расширения является локомотивом бизнес-приложения и позволяет подключать в Microsoft Office все возможности платформы .NET. Я буду показывать именно решение второго уровня.

Если кто заинтересовался возможностями VSTO — очень много про них есть в msdn.

Псевдозадача

Создадим маленький пример, иллюстрирующий все вышесказанное. Пусть есть требование, согласно которому пользователь может выделять текст из документа Microsoft Word и получать этот выделенный текст в окошке пользовательского элемента (знаю, дурацкий пример, но более сложного делать не хочется, а менее сложный уже трудно придумать).

Более подробно. Пользователь запускает Microsoft Word. После запуска среди тулбаров пользователю будет доступен ТР — тулбар расширения (т.е., нашего расширения). На нем находится кнопка, по нажатию которой пользователю показывется окно с кнопкой «Получить текст» и элементом управления multiline textbox. Пользователь нажимает на кнопку «Получить текст», выделенный в документе текст копируется в textbox. Все счастливы.

Понятно, что для жизни пример малопригоден. Но создаваемая инфраструктура позволит довольно просто нарастить на него «мускулы», если это, конечно, кому-то потребуется.

Создание solution

После установки VSTO в студии при создании нового solution станут доступны Office проекты:

Будьте аккуратны с названием — оно одновременно будет являться названием root namespace и поменять его можно будет только ручками через выгрузку проекта.

На выходе получается солюшен с двумя проектами:

WordCAB — это, собственно, add-in. Второй — не менее важный, это deployment проект для модуля расширения. Почему он важен?

Дело в том, что установка модуля расширения на рабочие станции пользователей — весьма трудоемкая затея. Она заключается не только в том, чтобы просто скопировать библиотеки в нужную папку. Для успешного фукнционирования модуля требуется прописать кучу ключей в реестр. Если копнуть глубже, получается, что модуль расширения подключается к Microsoft Office как COM-библиотека, со всеми вытекающими. Кому интересно, все нужные ключи реестра можно поглядеть в deployment-проекте (Нажать правой кнопкой, View->Registry).

В классе ThisAddIn находится точка доступа в модуль:

public partial class ThisAddIn
private void ThisAddIn_Startup( object sender, System. EventArgs e)
new AddInApplication().Run();
>

private void ThisAddIn_Shutdown( object sender, System. EventArgs e)
>

#region VSTO generated code

///

/// Required method for Designer support — do not modify
/// the contents of this method with the code editor.
///

private void InternalStartup()
this .Startup += new System.EventHandler(ThisAddIn_Startup);
this .Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
>

* This source code was highlighted with Source Code Highlighter .

В ThisAddIn_Startup будем писать код. Если быть точнее, будем запускать CAB-приложение.

Что такое CAB-приложение?

Это класс такой. В нем есть точка запуска — метод Run() , и некоторая инфраструктура каркаса — в частности, имеются доступ к главному прецеденту «Приложение» (т.е., к основному, рутовому WorkItem) и возможности переопределить системные сервисы, добавляемые в приложения по-умолчанию. Этот класс уже реализован в базовом виде, а программисту требуется параметризировать его — указать тип рутового прецедента и тип главной формы:

internal sealed class AddInApplication : WindowsFormsApplication
protected override void Start()
>
>

* This source code was highlighted with Source Code Highlighter .

В качестве типа главной формы (шелловой формы), указан object. Почему? Потому что приложение запускается в Microsoft Word, поэтому необходимости создавать главную форму нет. Форма Microsoft Word и есть главная форма, правда, без традиционных для нее возможностей.

По ходу пьесы мне пришло в голову немного прояснить модель приложения для модуля расширения в Microsoft Word.

Модель приложения Word Add-in

Итак, пользователь работает с документами. Более того, в единицу времени он может работать только с одним документом. Поэтому модуль расширения имеет четкий контекст — текущий открытый документ. (Кстати, в модели Microsoft Word VSTO этот документ обозначен как Globals.ThisAddIn.Application.ActiveDocument ). Отсюда (я сделал) вывод (или упрощение) — показывать пользовательские бизнес-элементы имеет смысл в модальном режиме, поскольку в ином случае нарушается контекст. Элементы управления, открытые для одного документа, должны существовать только во время активности этого документа.

Пример — пользователь открыл документ и открыл его карточку (не в модальном режиме). Переключился на другой документ, а карточка осталась для предыдущего — нарушение контекста и целостности восприятия. Разумеется, подобное поведение контролировать можно (и даже нужно, в некоторых случаях), но модальность элементов управления и жесткая их привязка к текущему активному документу делает жизнь проще.

Modal Workspace

Пользовательские элементы управления в каркасе CAB показываются в специальных так называемых рабочих зонах (Workspace). Согласно описанному выше поведению, нам требуется показывать элементы управления в модальном режиме. Поскольку родной CAB-овский WindowWorkspace оказался дубоват и выглядит некрасиво, я написал простенький свой — приводить код не буду, потому что его пара-тройка экранов. Насладиться творчеством можно скачав solution с кодом (ссылка на архив приведена в конце статьи).

Регистрация модальной рабочей зоны происходит в методе InitializeServices() главного прецедента — AddInWorkitem :

Workspaces.Add(( new SimpleModalWorkspace() ), WorkspaceNames.MainWorkspace);

* This source code was highlighted with Source Code Highlighter .

Итого: под ключем-идентификатором WorkspaceNames.MainWorkspace зарегистрировали модальную рабочую зону. Доступиться до нее теперь можно откуда угодно, где есть ссылка на главный прецедент: запрос интерфейса IWorkspace из коллекции Workspaces по указанному выше ключу. Все просто, как апельсин! (с) х/ф «Терминатор 2»

Фабрика элементов управления Microsoft Word

Речь пойдет о тулбаре Word и кнопках на нем. В VSTO это обертки над COM-объектами — CommandBar и CommandBarButton из пространства имен Microsoft.Office.Core . Жутко глючные штуки, если честно, особенно их анимация. Понять все тонкости и детали удалось только после ударного троллинга на форумах VSTO.

В чем идея — идея состоит в том, чтобы избавить программиста и разработчиков бизнес-модулей от необходимости работать с COM-обертками. Для этого, мы (то есть, я) интегрируем модель Misrosoft Word в механизм так называемых мест расширения (UiExtensionSite) каркаса CAB.

  1. В массив тулбаров Microsoft Word вставляется тулбар
  2. В коллекцию кнопок на тулбаре вставляется кнопка
  3. В кнопку уже ничего не вставляется (не рассматриваем случае комбобоксов, хотя они присутствуют), поэтому это терминальный объект
  1. IWordCommandBarContainer — контейнер тулбаров Microsoft Word
  2. IWordCommandBar — контейнер кнопок на тулбаре
  3. IWordButton — кнопка

К слову сказать, помимо определения элементов управления Word конкретные типы интерфейсов IWordCommandBar и IWordButton являются адаптерами к упомянутым выше CommandBar и CommandBarButton соответственно.

Для того, чтобы каркас понял, что, куда и, главное, каким образом вставлять, ему необходимо зарегистировать фабрику адаптеров для пользовательских элементов управления. В нашем случае, вставлять можно тулбары (в коллекцию тулбаров) и кнопки (в коллекцию кнопкок на тулбаре). Поэтому, регистрировать фабрику адаптеров нужно для IWordCommandBarContainer и для IWordCommandBar . Потом, когда пользователь будет получать место расширения, каркас будет искать инстансы классов добавления подчиненных элементов для этого места расширения, после чего использовать их по назначению — добавлять элементы. Ну а чтобы не заморачиваться, эти инстансы порождаются фабрикой:

public class CommandBarUIAdapterFactory : IUIElementAdapterFactory
public IUIElementAdapter GetAdapter( object uiElement)
if ( uiElement is IWordCommandBarContainer ) //тулбары
return new CommandBarUIAdapter(( IWordCommandBarContainer )uiElement);
if ( uiElement is IWordCommandBar ) //кнопки в тулбарах
return new CommandBarButtonUIAdapter(( IWordCommandBar )uiElement);

throw new ArgumentException( «uiElement» );
>

public bool Supports( object uiElement)
return ( uiElement is IWordCommandBarContainer ) || ( uiElement is IWordCommandBar );
>
>

* This source code was highlighted with Source Code Highlighter .

А вот реализация коллекции тулбаров (с возможностью добавить новый!)

internal class BarCollection : IWordCommandBarContainer
#region IWordCommandBarContainer Members

public void AddBar(IWordCommandBar bar)
CommandBar commandBar = null ;
//todo: сделать так, чтобы второй раз создать нельзя было
try
commandBar = Globals.ThisAddIn.Application.CommandBars[bar.Id];
>
catch ( ArgumentException )

if ( commandBar == null )
commandBar = Globals.ThisAddIn.Application.CommandBars.Add(bar.Id, ( object )MsoBarPosition.msoBarTop, _null, true );

private object _null = System.Reflection.Missing.Value;

* This source code was highlighted with Source Code Highlighter .

С кнопками на тулбарах аналогично. Гляньте код на досуге.

Пришлось, к слову, создавать фабрику самих кнопкок и тулбаров (см. IWordUIElementFactory ). Дело в том, что модули CAB работают с интерфейсами IWordCommandBar и IWordButton . Конкретные типы этих интерфейсов находятся в сборке VSTO Word-AddIn и завязаны на Microsoft.Office.Core . Поэтому, чтобы в модулях (где отсутствует ссылка на Office) была возможность получать инстансы указанных элементов, создается фабрика. Она регистрируется в главном WorkItem.

Регистрация фабрик и места расширения под тулбары:

Services.AddNew();
IUIElementAdapterFactoryCatalog factoryService = base .Services.Get();
factoryService.RegisterFactory( new CommandBarUIAdapterFactory());

UIExtensionSites.RegisterSite(UIExtensionSiteNames.WordBarsSite, new BarCollection());

* This source code was highlighted with Source Code Highlighter .

Если вы запутались, извините:) Я сам понимаю, что тут без поллитры не разберешься. (Если подебажиться, то многое становится понятным.)

Модуль CAB

Это обычная сборка. В ней должен быть класс ModuleInit . В этом классе есть ссылка на главный прецедент AddInWorkitem и, как следствие, есть доступ ко всему добру, про которое я писал выше.

Задача модуля CAB такова — подгрузиться к главному преценденту, вставить тулбар, вставить кнопку на него, описать обработчик кнопки:

UIExtensionSite site = _rootWorkItem.UIExtensionSites[UIExtensionSiteNames.WordBarsSite];
IWordCommandBar mainBar = site.Add(_factory.CreateBar( «AddInToolbar» ));

IWordButton btn = _factory.CreateButton(mainBar, CommandNames.OpenForm, ToolStripItemDisplayStyle.ImageAndText, «Открыть окно» ,
«Открыть форму просмотра Custom Control» , Resources.OpenForm, false );

mainBar.AddButton(btn);
btn.Click += new EventHandler(ButtonClick);

* This source code was highlighted with Source Code Highlighter .

Обработчик кнопки будет создавать пользовательское окно с кнопкой «получить текст» и текстовым полем, после чего показывать его (применив специальный модификатор показа WindowSmartPartInfo ) в ранее упомянутой рабочей зоне (которую, как мы помним, я зарегистрировал в прецеденте под ключем WorkspaceNames.MainWorkspace ):

private void ButtonClick( object sender, WordButtonClickArgs e)
object smartPart = _rootWorkItem.SmartParts.AddNew();
WindowSmartPartInfo info = new WindowSmartPartInfo();
info.FormStartPosition = FormStartPosition.CenterScreen;
info.MaximizeBox = false ;
info.MinimizeBox = false ;
info.Resizable = false ;
info.Title = «Custom Control» ;
info.ShowInTaskbar = false ;
_rootWorkItem.Workspaces[WorkspaceNames.MainWorkspace].Show(smartPart, info);
>

* This source code was highlighted with Source Code Highlighter .

Подгрузка модуля

Здесь я сделал финт коленом. Обычно модули подгружаются в каркас через специальный декларативный формат подгрузки — так называемый ProfileCatalog. Обычно, это хороший способ подключить все, что нужно. Но, учитывая суровые советские реалии, имеется ненулевая вероятность того, что программисту потребуется недекларативная логика подключения модуля. Для этого мы будем переопределять специальный сервис перечисления подгружаемых модулей — IModuleEnumerator . Я сделал его очень простым — он глядит в папку исполняемой сборки и ищет в ней модуль под названием CustomModule.dll. Находит, и подгружает. Ну, или не подгружает, если не находит:

public class CustomModuleEnumerator : IModuleEnumerator
#region Constants
private const string ModuleName = «CustomModule.dll» ;
#endregion

#region IModuleEnumerator Members

public IModuleInfo[] EnumerateModules()
List result = new List ();

string path = GetModulePath(ModuleName);
if ( File .Exists(path) )
result.Add( new ModuleInfo(ModuleName));
return result.ToArray();
>

#region Private Methods
private string GetModulePath( string assemblyFile)
if ( !Path.IsPathRooted(assemblyFile) )
assemblyFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, assemblyFile);

return assemblyFile;
>
#endregion
>

* This source code was highlighted with Source Code Highlighter .

Сейчас эта служба очень простая, но при желании, разумеется, в нее можно нагородить хоть черта лысого. Например, подгружать модули из базы данных:)

Перегрузить эту службу нужно в классе приложения CAB:

protected override void AddServices()
base .AddServices();

* This source code was highlighted with Source Code Highlighter .

Доктор, я устал. Что получилось?

Получилось то, что задумывалось в изначальном псевдопримере:

В тулбарах Microsoft находится наш тулбар, на нем висит кнопка с иконкой, по событию нажатия кнопки вылезает пользовательский элемент управления, в текстовое поле которого с помощью кнопки можно загнать выделенный в документе текст:) Тривиально, но обратите внимание, как ничтожна связность между объектами! Хочется подметить, что у каркаса, при должном обращении, идеальная code maintainability.

Внимание! Подводные камни!
Security

Когда скомпилируете и запустите пример, ничего не запустится. Более того, вывалится сообщение, которое скажет вам — дескать, не хватает прав на запуск стороннего модуля (в нашем случае, CustomModule.dll). Проблема в том, что по умолчанию приложение VSTO (в режиме разработки!) дает Full Trust права только на исполняемую сборку и на все сборки, от которых она зависит — т.е. на WordCAB.dll. Для того, чтобы разрешить использование кода сторонних библиотек, выполните следующее действие:
C:\Windows\Microsoft.NET\Framework\v2.0.50727>caspol -u -ag All_Code -url «D:\Projects\WordCAB\bin\Debug\*» FullTrust
Microsoft (R) .NET Framework CasPol 2.0.50727.3053
Copyright (c) Microsoft Corporation. All rights reserved.

The operation you are performing will alter security policy.
Are you sure you want to perform this operation? (yes/no)
yes
Added union code group with «-url» membership condition to the User level.
Success

Вместо «D:\Projects\WordCAB\bin\Debug\*» нужно указать папку, из которой производится запуск Add-in. Не забудьте про звездочку.

Add-in перестал загружаться!

Иногда, когда в модуле возникает необработанный Exception, Word блокирует исполнение этого модуля при следующей загрузке. Зайдите Help->About->Disabled Items и посмотрите, нет ли в списке вашего расширения. Если есть, уберите его оттуда. При следующем Run-Debug он появится.

Как убрать

Удаление расширения не такое тривиальное. Вытащите кнопку COM-AddIns на тулбар Microsoft Word. Для этого надо зайти в Tools->Customize->Tools->(Drag’n’Drop)COM-AddIns. Кликните на нее и снимите галку с вашего расширения. Он выгрузится. Чтобы заново подгружать, наоборот, выставите галку обратно. Другой способ — зайти в панель управления и удалить из программ.

А что с Word 2007?

Add-in замечательно подгружается в Ribbon на последнюю вкладку.

Там еще кучка мелких подводных камней. Но я тут и так уже настолько много написал, что не уверен, что кто-нибудь до конца дочитает:)

Где взять код

Выводы

В общем, можно взять VSTO, Microsoft Office 2003, .NET Framework 2.0 и сделать решение. Базовое решение, на которое можно нарастить функционал, я привел в этой статье. Кто хочет — пользуйтесь на здоровье. Буду рад ответить на вопросы и подправить неточности, если здесь такие будут. Спасибо огромное за внимание!

Автоматизация Word из Visual Basic .NET для создания нового документа

В этой пошаговой статье описывается создание нового документа в Word с помощью службы автоматизации из Visual Basic .NET.

Пример кода

В примере кода в этой статье показано, как сделать следующее:

  • Вставка абзацев с текстом и форматированием.
  • Просмотр и изменение различных диапазонов в документе.
  • Вставка таблиц, форматирование таблиц и заполнение таблиц данными.
  • Добавление диаграммы.

Чтобы создать документ Word с помощью службы автоматизации из Visual Basic .NET, выполните следующие действия.

  1. Запустите Microsoft Visual Studio .NET. В меню Файл выберите пункт Создать, а затем — Проект. В разделе Типы проектов выберите Проекты Visual Basic, а затем — Приложение Windows в разделе Шаблоны. Форма Form1 создается по умолчанию.
  2. Добавьте ссылку на библиотеку объектов Microsoft Word. Для этого выполните следующие действия:
    1. В меню Проект щелкните Добавить ссылку.
    2. На вкладке COM найдите библиотеку объектов Microsoft Word и нажмите кнопку Выбрать.

    Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim oWord As Word.Application Dim oDoc As Word.Document Dim oTable As Word.Table Dim oPara1 As Word.Paragraph, oPara2 As Word.Paragraph Dim oPara3 As Word.Paragraph, oPara4 As Word.Paragraph Dim oRng As Word.Range Dim oShape As Word.InlineShape Dim oChart As Object Dim Pos As Double 'Start Word and open the document template. oWord = CreateObject("Word.Application") oWord.Visible = True oDoc = oWord.Documents.Add 'Insert a paragraph at the beginning of the document. oPara1 = oDoc.Content.Paragraphs.Add oPara1.Range.Text = "Heading 1" oPara1.Range.Font.Bold = True oPara1.Format.SpaceAfter = 24 '24 pt spacing after paragraph. oPara1.Range.InsertParagraphAfter() 'Insert a paragraph at the end of the document. '** \endofdoc is a predefined bookmark. oPara2 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range) oPara2.Range.Text = "Heading 2" oPara2.Format.SpaceAfter = 6 oPara2.Range.InsertParagraphAfter() 'Insert another paragraph. oPara3 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range) oPara3.Range.Text = "This is a sentence of normal text. Now here is a table:" oPara3.Range.Font.Bold = False oPara3.Format.SpaceAfter = 24 oPara3.Range.InsertParagraphAfter() 'Insert a 3 x 5 table, fill it with data, and make the first row 'bold and italic. Dim r As Integer, c As Integer oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 3, 5) oTable.Range.ParagraphFormat.SpaceAfter = 6 For r = 1 To 3 For c = 1 To 5 oTable.Cell(r, c).Range.Text = "r" & r & "c" & c Next Next oTable.Rows.Item(1).Range.Font.Bold = True oTable.Rows.Item(1).Range.Font.Italic = True 'Add some text after the table. 'oTable.Range.InsertParagraphAfter() oPara4 = oDoc.Content.Paragraphs.Add(oDoc.Bookmarks.Item("\endofdoc").Range) oPara4.Range.InsertParagraphBefore() oPara4.Range.Text = "And here's another table:" oPara4.Format.SpaceAfter = 24 oPara4.Range.InsertParagraphAfter() 'Insert a 5 x 2 table, fill it with data, and change the column widths. oTable = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 5, 2) oTable.Range.ParagraphFormat.SpaceAfter = 6 For r = 1 To 5 For c = 1 To 2 oTable.Cell(r, c).Range.Text = "r" & r & "c" & c Next Next oTable.Columns.Item(1).Width = oWord.InchesToPoints(2) 'Change width of columns 1 & 2 oTable.Columns.Item(2).Width = oWord.InchesToPoints(3) 'Keep inserting text. When you get to 7 inches from top of the 'document, insert a hard page break. Pos = oWord.InchesToPoints(7) oDoc.Bookmarks.Item("\endofdoc").Range.InsertParagraphAfter() Do oRng = oDoc.Bookmarks.Item("\endofdoc").Range oRng.ParagraphFormat.SpaceAfter = 6 oRng.InsertAfter("A line of text") oRng.InsertParagraphAfter() Loop While Pos >= oRng.Information(Word.WdInformation.wdVerticalPositionRelativeToPage) oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd) oRng.InsertBreak(Word.WdBreakType.wdPageBreak) oRng.Collapse(Word.WdCollapseDirection.wdCollapseEnd) oRng.InsertAfter("We're now on page 2. Here's my chart:") oRng.InsertParagraphAfter() 'Insert a chart and change the chart. oShape = oDoc.Bookmarks.Item("\endofdoc").Range.InlineShapes.AddOLEObject( _ ClassType:="MSGraph.Chart.8", FileName _ :="", LinkToFile:=False, DisplayAsIcon:=False) oChart = oShape.OLEFormat.Object oChart.charttype = 4 'xlLine = 4 oChart.Application.Update() oChart.Application.Quit() 'If desired, you can proceed from here using the Microsoft Graph 'Object model on the oChart object to make additional changes to the 'chart. oShape.Width = oWord.InchesToPoints(6.25) oShape.Height = oWord.InchesToPoints(3.57) 'Add text after the chart. oRng = oDoc.Bookmarks.Item("\endofdoc").Range oRng.InsertParagraphAfter() oRng.InsertAfter("THE END.") 'All done. Close this form. Me.Close() End Sub
    Imports Word = Microsoft.Office.Interop.Word

    После завершения кода изучите документ, созданный для вас. Документ содержит две страницы отформатированных абзацев, таблиц и диаграммы.

    Использование шаблона

    Если вы используете службу автоматизации для создания документов в общем формате, вы можете начать процесс с нового документа, основанного на предварительно отформатованном шаблоне. Использование шаблона с клиентом службы автоматизации Word имеет два существенных преимущества по сравнению с созданием документа из ничего:

    • Вы можете иметь больший контроль над форматированием и размещением объектов в документах.
    • Вы можете создавать документы с меньшим количеством кода.

    С помощью шаблона можно точно настроить размещение таблиц, абзацев и других объектов в документе, а также включить форматирование этих объектов. С помощью службы автоматизации можно создать новый документ на основе шаблона с таким кодом:

    oWord.Documents.Add "\MyTemplate.dot"

    В шаблоне можно определить закладки, чтобы клиент службы автоматизации смог заполнить текст переменной в определенном расположении в документе следующим образом:

    oDoc.Bookmarks.Item("MyBookmark").Range.Text = "Some Text Here"

    Еще одно преимущество использования шаблона заключается в том, что вы можете создавать и хранить стили форматирования, которые необходимо применять во время выполнения, следующим образом:

    oDoc.Bookmarks.Item("MyBookmark").Range.Style = "MyStyle"
    oWord.Selection.Style = "MyStyle"

    Ссылки

    Чтобы получить дополнительные сведения об использовании Visual Basic .NET для автоматизации Microsoft Word, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

    301656 Автоматизация Word для выполнения слияния из Visual Basic .NET

    Word документ открыть в приложении

    Добрый день! Уважаемые коллеги, ваша помощь нужна. Есть шаблон документа набранный в Word сохранен как .docx. Теперь есть необходимость, чтобы после его правки он попадал в базу. С этим вопросов нету, но нужно, чтобы редактирование было именно в самом приложении. Как можно его открыть. Не могу найти OLE объект или есть иные варианты?

    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    Открыть Word документ
    Добрый день. Есть необходимость перегнать Word документ в byte, а потом открыть его на другом.

    Как открыть документ Word из C#?
    Как открыть документ Word, который находиться на диске из WinForm (C#) ? Надо ли подключать Com.

    Открыть документ Word из памяти
    Столкнулся с проблемой, но не знаю уже куда копать. У меня осуществляется сохранение.

    Открыть документ doc в MS Word
    Как сделать чтоб при нажатии на кнопку открывался определённый документ Word пример Readme.doc в.

    256 / 209 / 52
    Регистрация: 01.08.2016
    Сообщений: 815

    UBUNTU, выберите в списке СОМ- Microsoft Word 9.0 Object Library (или другую версию, это зависит от того, какая версия MS Word у вас установлена на компьютере)
    потом импортируйте в пространстве имен:

    Imports Word = Microsoft.Office.Interop.Word

    Добавлено через 48 минут
    Ну а если и еще открыть то так:

    1 2 3 4 5 6 7
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim Wrd As Word.Application Dim oDoc As Word.Document Wrd = CreateObject("Word.Application") Wrd.Visible = True nDoc = Wrd.Documents.Add("путь к файлу") End Sub

    4357 / 3488 / 836
    Регистрация: 02.02.2013
    Сообщений: 3,372
    Записей в блоге: 2
    Если ссылка на Interop.Word уже установлена, то чтобы открыть Word используйте следующий код

    1 2 3 4 5 6 7 8 9 10 11
    Imports WRD = Microsoft.Office.Interop.Word 'использую псевдоним для удобства Imports System.IO Public Class Form1 Private wApp As WRD.Application Private wDoc As WRD.Document Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load wApp = New WRD.Application wDoc = wApp.Documents.Open(Path.Combine(Application.StartupPath, "tst.docx")) wApp.Visible = True End Sub '…

    Есть и другой вариант т.н. «позднее связывание» (то, что выше именуют «раннее связывание»). Здесь ссылка на Interop.Word не требуется.

    1 2 3 4 5
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim W = CreateObject("Word.Application") W.Documents.Open(IO.Path.Combine(Application.StartupPath, "tst.docx")) W.Visible = True End Sub

    Глава 9 Использование функций ms Word, ms Excel, AutoCad и matlab

    Пример 54. Проверка правописания в текстовом поле с помощью обращения к MS Word Пакет приложений Microsoft Office может являться сервером OLE-объектов, и его функции могут использоваться другими приложениями. Продемонстрируем такое использование. Для этого создадим программу, которая позволяет пользова­телю ввести какие-либо слова, предложения в текстовое поле и после нажатия со­ответствующей кнопки проверить орфографию введенного текста. Для непосредст­венной проверки орфографии воспользуемся функцией СheckSpelling объектной библиотеки MS Word. Запустим Visual Studio 2010, выберем новый проект Windows Forms Applica­tion С#. Перетащим из панели элементов Toolbox в форму текстовое поле. Чтобы растянуть его на всю форму в свойстве Multiline текстового поля укажем True (разрешим введение множества строк). Также с панели элементов перетащим кнопку Button. Мы должны получить примерно такой дизайн, который представ­лен на рис. 9.1. Рис. 9.1. Фрагмент работы программы проверки орфографии Далее к текущему проекту добавим объектную библиотеку MS Word (библиотеку компонентов). Для этого в пункте меню Project выберем команду Add Refer. Затем, если на вашем компьютере установлен MS Office 2003, то на вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Word 11.0 Object Librrary. Если же установлен MS Office 2007, то дважды щелкнем на ссылке Microsoft Word 12.0 Object Library. Эта объектная библиотека соответствует файлу, расположенному по адресу: C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB( или . \OFFICE12\MSWORD.OLB для MS Office 2007). Теперь убедимся в том, что данная ссылка благополучно установлена. Для этого в обозревателе решений раскроем узел References, здесь среди прочих ссылок идим строку Microsoft.Office.Intеrop.Word. Кроме того, в папке проекта obj\x86\Debug появился файл Interop.Office.dll. Tаким образом, мы подключили библиотеку объектов MS Word. Далее введем программный код, представленный в листинге 9.1. Листинг 9.1. Проверка орфографии //Добавляем эту директиву для более коротких выражений using Ворд = Microsoft.Office.Interop; System; using System; using System.Windows.Forms; //Программа позволяет пользователю ввести какие-либо слова, предложения в текстовое поле и после нажатия //соответствующей кнопки проверить орфографию введенного текста. Для непосредственной проверки орфографии //воспользуемся функцией CheckSpelling объектной библиотеки MS Word, // Другие директивы using удалены, поскольку они не используются в данной программе namespace Орфография < //В пункте меню Project выберем команду Add Reference. //Затем, если на вашем компьютере установлен MS Office 2007, //то на вкладке СОМ дважды щелкнем по ссылке //на библиотеку Microsoft Word 12.0 Object Libary. public partial class Form1 : Form < public Form1() < InitializeComponent(); textBox1.Clear(); button1.Text = "Проверка орфографии"; >Private void button1_Click(object sender, EventArgs e) < var Ворд1 = new Ворд.Word.Application(); Ворд1.Visible = false; Ворд1.Documents.Add(); // Открываем новый документ // Копируем содержимое текстового окна в документ Ворд1.Selection.Text = textBox1.Text; // Проверка орфографии: Ворд1.ActiveDocument.CheckSpelling(); // Копируем результат назад в текстовое поле textBox1.Text = Ворд1.Selection.Text; Ворд1.Documents.Close(Ворд.Word.WdSaveOptions.wdDoNotSaveChanges); // или Ворд.ActiveDocument.Close // (Ворд.Word.WdSaveOptions.wdDoNotSaveChanges); // Это важно: Bopд1.Quit(); Ворд1 = null; >> > Как видно из текста программы, сразу после InitializeComponent очищается текстовое поле и инициализируется название кнопки Проверка орфографии. При обработке события «щелчок по кнопке» Button1.click создается новый объект класса Word.Application и командой Documents.Add открывается новый документ. Далее весь введенный пользователем текст копируется в этот документ. Затем про­исходит непосредственная проверка орфографии командой CheckSpelling. Далее документ закрываем без сохранения изменений wdDoNotSaveChanges. После нажа­тия кнопки Проверка орфографии получим диалоговое окно, подобное представ­ленному на рис. 9.2. Рис. 9.2. Проверка правописания в текстовом поле Выберем правильный вариант написания слова и щелкнем на кнопке 3aменить, при этом диалоговое окно закроется, а в нашем текстовом поле на форме окажется исправленное слово. Убедиться в работоспособности программы можно, открыв решение Орфография.sln в папке Орфография. Пример 55. Вывод таблицы средствами MS Word В данной книге мы уже рассматривали способы формирования таблицы. Здесь мы обсудим способ создания таблицы, используя функции MS Word. Вообще говоря программировать взаимодействие программы на Visual С#2010 с различными офисными приложениями (Word, Excel, Access, PowerPoint и т. д.), а также с AutoCAD, CorelDRAW удобно, поскольку во все эти приложения встроен язык VBA (Visual Basic for Applications), в арсенале которого используются программные объекты, названия и назначения которых в многом схожи с объектами, используемыми в VisualС#. Причем есть возможность записи макроса с последующим просмотром соотвествующей VBA-программы. Например, мы хотим посмотреть, как организована вставка таблицы в редакторе MS Word. Для этого запускаем MS Word, затем в меню Сервис выбираем команду Макрос | Начать запись, далее в диалоговом окне Запись макроса указываем имя макроса и щелкаем на кнопке ОК. Теперь в текст MS Word вставляем таблицу, используя пункты меню Таблица | Вставить | Таблица и т. д. После заполнения таблицы нажимаем кнопку Остановить запись. Далее помощью комбинации клавиш Alt>+F11> откроем окно Microsoft Visual Basil здесь мы увидим текст макроса на языке VBA. Из этого текста мы можем понять основной принцип, имена используемых объектов, функций, свойств и проч. А теперь рассмотрим уже конечный результат— программу на Visual С#2010, которая, используя функции MS Word, строит таблицу. Итак, запускаем Visual Studio 2010, выбираем новый проект, указываем шаблон Windows Form Application С#. Далее к текущему проекту добавим объектную библиотеку MS Word. Для этого в меню Project укажем команду Add Reference и на появившейся вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Word 11.0 Object Library (или другая версия MS Word). На экранную форму перенесем командную кнопку Button, чтобы работа программы выглядела более выразительно. То есть именно после щелчка на кнопке будет формироваться таблица и вызываться MS Word для ее отображения. Далее введем программный код, представленный в листинге 9.2. Листинг 9.2. Вывод таблицы средствами MS Word // Программа вывода таблицы средствами MS Word: запускается программа, // пользователь наблюдает, как запускается редактор MS Word //и автоматически происходит построение таблицы using System; using System.Windows.Forms; // Добавляем эту директиву для более коротких выражений using Ворд = Microsoft.Office.Interop; // Дpyгие директивы using удалены, поскольку они не используются в данной программе namespace TaблицaWord ( public partial class Form1:Form < public Form1() < // В меню Project укажем команду Add Reference и на появившейся // вкладке СОМ дважды щелкнем по ссылке на библиотеку // Microsoft Word 12.0 Object Library InitializeComponent(); Button1.Text = "Пуск"; base.Text = "Построение таблицы"; >private void buttonl_Click(object sender, EventArgs e); < string[] Imena = ; string[] Tel = ; var Ворд1 = new Ворд.Word.Application(); Ворд1.Visible = true; Ворд1.Documents.Add(); // Открываем новый документ Ворд1.Selection.TypeText("ТАБЛИЦА ТЕЛЕФОНОВ"); // Создаем таблицу из 9 строк и 2 столбцов; // автоподбор ширины столбцов - // по содержимому ячеек (wdAutoFitContent) Ворд1.ActiveDocument.Tables.Add(Ворд1.Selection.Range, 9, 2, Ворд.Word.WdDefaultTableBehavior.wdWord9TableBehavior, Ворд.Word.WdAutoFitBehavior.wdAutoFitContent); // Заполнять ячейки таблицы можно так: for (int i = 1; i // Перевести курсор (Selection) за пределы таблицы Ворд1.Selection.MoveDown(Ворд.Word.WdUnits.wdLine, 9); Ворд1.Selection.TypeText("Какой-либо текст после таблицы"); // Сохранять нет смысла, но это решит пользователь // W.ActiveDocument.SaveAs("С:\a.doc") > > > Заметим, что содержимое текстовой таблицы такое же,- как и в примере 44 (см. главу 7). То есть наш сюжет меняется, а действующие персонажи остаются npeжними. Данные находятся в двух массивах: Imena() и Tel(). Далее создаем экземпляр объекта Word.Application и открываем новый документ Document.Add. Затем демонстрируем, как можно добавлять какие-либо тексты в новый документ из С#-программы, например, мы вводим в активный докумет текст «ТАБЛИЦА ТЕЛЕФОНОВ«. Далее создаем таблицу, состоящую из девяти строк (рядов) и двух столбцов, причем ширина столбцов будет регулироваться в зависимости от содержимого ячеек (wdAutoFitContent). Затем в цикле заполняем ячейки таблицы и выводим курсор (Selection) за пределы таблицы, чтобы написать какой-либо текст. Рис. 9.3. Программно сформированная таблица в редакторе MS Word После запуска этой программы очень красиво, прямо на наших глазах в редакторе MS Word сформируется таблица (рис. 9.3), которую при желании можно редактировать. сохранять и распечатывать на принтере. Убедиться в работоспособности программы можно, открыв решение ТаблицаWord.sln в папке TaблицaWord. Пример 56. Обращение к функциям MS Excel из Visual С# 2010 Очень заманчиво обратиться из какой-нибудь вашей С#-программы к функциям Microsoft Excel. Табличный редактор MS Excel содержит очень мощные средства для сложных вычислений и анализа данных, которые могут значительно расширить возможности ваших программ. В данной программе мы продемонстрируем буквально в трех строчках про­граммного кода обращение к одной простой функции MS Excel, а именно получе­ние значения числа π = 3,14. Число π представлено в классе Math языка С#. Но цель данной программы — показать легкость доступа к функциям MS Excel. Как обычно, запустим Visual Studio 2010, далее в окне New Project выберем шаблон Windows Forms Application С# и щелкнем на кнопке ОК. Проектируемую экранную форму сделаем совсем маленькой, поскольку число π будем выводить в строку заголовка формы. Чтобы добавить в текущий проект возможности MS Excel, следует подключить библиотеку объектов MS Excel. Для этого в пункте меню Project выберем команду Add Reference. Затем, если на вашем компьютере установлен пакет MS Office 2003, то на вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Excel 11.0 Object Library. Если же установлен MS Office 2007, то дважды щелк­нем на ссылке Microsoft Excel 12.0 Object Library. To есть процедура добавления новой библиотеки объектов такая же, как и в примерах об использовании возмож­ностей MS Word, а названия пунктов меню сохранились почти такими же, как в предыдущих версиях Visual Studio. Подключить новую библиотеку объектов в текущий проект можно также через контекстное меню окна Solution Explorer (Обо­зреватель решений), щелкнув на пункте Add Reference. Таким образом, мы подключили библиотеку объектов MS Excel. В окне Soluton Explorer (чтобы его добавить, следует щелкнуть на значке Solution Explorer) Щелкните на значке Show All Files, а затем раскройте дерево References. Одной из ветвей дерева будет ветвь Excel. Щелкнув правой кнопкой мыши на значке этой ветви и выбрав пункт View in Object Browser, мы увидим объекты данной ветви в окне Object Browser (Обозреватель объектов). Найдем объект WorksheetFunction, при этом в окне Members of ‘WorksheetFunction увидим доступные нам функции MS Excel для объекта WorksheetFunction. Теперь в программном коде обратимся к одной из этих функций, а именно функции Pi (). Для этого перейдем на вкладку программного кода Form1.cs и напишем программный код, приведенный в листинге 9.3. Листинг 9.3. Обращение к одной из функций MS Excel // Программа обращается к одной простой функции объектной библиотеки // MS Excel для получения значения числа Пи = 3,14 using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace ЕхсеlПи < // Чтобы добавить ссылку на объектную библиотеку Excel, в пункте меню // Project выберем команду. Add Reference. Затем, если на вашем компьютере // установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке // на библиотеку Microsoft Excel 12.0 Object Library, public partial class Form1 : Form < public Form1() < InitializeComponent(); // Создание экземпляра класса Excel.Application var xl = new Microsoft.Office.Interop.Excel.Application(); double PI = xl.WorksheetFunction.Pi(); // Выводим значение ПИ в строку заголовка формы this.Text = "PI /html/2706/299/html_K3IbEOBFaI.3ZEF/htmlconvd-cxLmRK_html_6b3a7c83fe5b0bc1.png" name="Image73" align="bottom" width="317" height="64" border="0">Рис. 9.4. Вывод числа л в заголовок формы Убедиться в работоспособности программы можно, открыв решение ЕхсеlПи.sln в папке ЕхсеlПи. Пользоваться функциями MS Excel в Сопрограмме очень перспективно. Например, оцените возможность решать сложнейшие в математическом смысле оп­ерационные задачи (т. е. задачи нахождения максимума/минимума с набором ограничений), доступные в MS Excel через Сервис | Поиск решения. Пример 57. Использование финансовой функции MS Excel Рассмотрим еще один пример обращения к функциям MS Excel из программы на С# 2010. Допустим, вы взяли кредит на покупку квартиры 100 тыс. долларов под 15% годовых, срок погашения кредита— 10 лет. Требуется узнать сумму, которую вы вынуждены будете платить ежемесячно. В русскоязычном MS Excel для подоб­ных расчетов есть функция ПЛТ(), на вход которой следует подать месячную про­центную ставку (т. е. в нашем случае 0.15/12), срок погашения кредита в месяцах (120 месяцев) и размер кредита ($100 тыс.). Аналогом функции ПЛТ() является функция (метод) Pmt() класса WorksheetFunction, которая имеет такие же аргу­менты. Таким образом, мы можем написать С# -программу с обращением к функ­ции Pmt() и проверить результат в русскоязычной версии MS Excel. Список всех методов (функций) объекта WorksheetFunction с описанием аргументов можно найти по адресу: http://msdn.microsoft.com/en—us/library/bb225774.aspx. Для программирования обращений к этим функциям из программы, созданной в Visual Studio 2010, важно найти соответствие русскоязычных функций MS Excel и их аналогов в объекте WorksheetFunction для отладки на тестовых примерах. Запустим Visual Studio 2010, далее закажем новый проект из шаблона Windows Forms Application С#. В проектируемую экранную форму из панели Toolbox пе­ренесем три метки, три текстовых поля (для ввода трех вышеперечисленных аргу­ментов функции Pmt() и кнопку. В текущий проект подключаем библиотеку объ­ектов MS Excel. Для этого в меню Project выберем команду Add Reference, затем на вкладке СОМ дважды щелкнем на ссылке Microsoft Excel 12.0 Object Library. Теперь можно перейти к программному коду, приведенному в листинге 9.4. Листинг 9.4. Использование финансовой функции MS Excel // Программа использует финансовую функцию Pmt() объектной библиотеки //MS Excel для вычисления суммы периодического платежа на основе // Постоянства сумм платежей и постоянства процентной ставки using System; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace ЕхсеlПлт < // Для подключения библиотеки объектов MS Excel в пункте меню Project // выберем команду Add Reference. Затем, если на вашем компьютере // установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке //на библиотеку Microsoft Excel 12.0 Object Library public partial class Form1:Form < public Form1() < InitializeComponent(); Label1.Text = "Год. ставка в %"; label2.Text = "Срок в месяцах"; label3.Text = "Размер кредита"; textBox1.Clear();textBox2.Clear();textBox3.Clear(); this.Text = "Расчет ежемесячных платежей";button1.Text = "Расчет" >private void button1_Click(object sender, EventArgs e) < try < var XL = new Microsoft.Office.Interop.Excel.Application() ; double pay = XL.WorksheetFunction.Pmt( (Convert.ToDouble(textBoxl.Text)) / 1200, Convert.ToDouble(textBox2.Text), Convert.ToDouble(textBox3.Text)); // ИЛИ, если использовать функцию Pmt() из Microsoft.VisualBasic //double pay = Microsoft.VisualBasic.Financial.Pmt( // (Convert.ToDouble(textBoxl.Text)) / 1200, // Convert.ToDouble(textBox2.Text), // Convert.ToDouble(textBox3.Text)); string ss = String.Format( "Каждый месяц следует платить долларов", Math.Abs(pay)); MessageBox.Show(ss); > catch(Exception Ситуация) < MessageBox.Show(Ситуация.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); >> > > Как видно из текста программы, сразу после вызова метода InitializeComponent очищаются (clear) текстовые поля, а также подписываются названия этих полей с помощью меток label1—iabel3 и присваивается название кнопки Button1. Рис. 9.5. Расчет ежемесячных платежей Убедиться в работоспособности программы можно, открыв решение ExcelПлт.sln в папке ExcelПлт. В данном примере на простом примере мы рассмотрели, как легко подклю­читься к библиотеке объектов MS Excel и пользоваться ее функциями. Однако Функция Pmt() имеется также в среде Visual Studio 2010 в пространстве имен Microsoft .VisualBasic. Financial точно с такими же параметрами. (Более того, эта функция была еще в Visual Basic 6.) Для обращения к этой функции потребовалось бы подключение к Visual Basic, как мы это делали в примере 14 (см. глава2). То есть следовало бы в проект добавить ссылку на библиотеку Microsoft.VisualBasic.dll. Для этого в пункте меню Project надо выбрать команду Аdd Reference, а на вкладке .NET дважды щелкнуть на ссылке Microsoft.VisualBasic. В этом случае можно было бы обращаться к функции Pmt(), как это представлено в комментарии. Однако в данном примере показана принципиальная возможность работы с функциями MS Excel из С#-программы. Пример 58. Решение системы уравнений р с помощью функций MS Excel Используя функции MS Excel, в своей программе, созданной в Visual С#2011 можно решать и более серьезные задачи. Например, рассмотрим, как решить ] I тему линейных алгебраических уравнений: X1 + X2 + X3 = 6 Х1 + Х2 = 3 Х2 + Х3 = 5 через обратную матрицу. Исходную систему уравнений запишем в матричном виде А • X = L. Здесь А — матрица коэффициентов при неизвестных; X — вектор неизвестных X1, Х2, Х3; L — вектор свободных членов 6, 3, 5. Тогда решением системы будет выражение X=A -1 •L, где Х -1 —обратная матрица. Для нахождения обратной матрицы в русскоязычной версии MS Excel есть функция МОБР(), а объект WorksheetFunction в библиотеке объектов Microsoft Excel имеет функцию Minverse(). Для умножения обратной матрицы на вектор свободных членов есть соответственно функции мпроиз() и MMult(). Таких функций нет в Visual Studio 2010, и в данном случае мы получаем реальный положительный эффект от подключения к функциям MS Excel. Для программной реализации решения поставленной задачи запустим Visual Studio 2010. Далее выберем новый проект из шаблона Windows Forms Application С# и щелнем на кнопке ОК. В проектируемую форму из панели Toolbox добавив метку и растянем ее побольше и симметрично относительно формы. На ней 6yдем формировать ответ задачи. Кроме того, добавим библиотеку объектов MS Ехel. Для этого в пункте меню Project выберем команду Add Reference и на вкладке СОМ отметим библиотеку Microsoft Excel 12.0 Object Library, а затем щелкнем на кнопке ОК. Программу построим следующим образом (листинг 9.5): сразу после выполнения процедуры InitializeComponent прямо в тексте программы зададим (инициализируем) прямую матрицу в виде двумерного массива и вектор свободных членов в виде одномерного массива. Затем после решения системы выведем ответ на метку label1. Листинг 9.5. Решение системы линейных алгебраических уравнений // Программа решает систему уравнений с помощью функций объектной // библиотеки MS Excel using System; using System.Windows.Forms; using XL = Microsoft.Office.Interop.Excel.Application; // Другие директивы using удалены, поскольку они не используются в данной программе namespace ЕхсеlСЛАУ < // Для подключения библиотеки объектов MS Excel в пункте меню Project , //выберем команду Add Reference. Затем, если на вашем компьютере //установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке // на библиотеку Microsoft Excel 12.0 Object Library public partial class Form1:Form < public Form1() < InitializeComponent(); // Матричное уравнение AX = L решаем через // обратную матрицу: X = A(-1)L. // Здесь (-1) - "знак" обратной матрицы. // Решаем систему // XI + X2 + Х3 = 6 // XI + Х2 =3 // Х2 + ХЗ = 5 // Для этой системы прямая матрица будет иметь вид // double[,] А = new double[n, n]; // - матрица коэффициентов Double[,] А = , , >; // double[] L = new double[n]; // — вектор свободных членов // Свободные члены Double[] L = < 6, 3, 5 >; XL XL1 = new XL() ; // Вычисление детерминанта матрицы A double det_A = XL1.Application.WorksheetFunction.MDeterm(A); // Если det_A != 0, то выход из процедуры: if (Math.Abs(det_A) < 0.01) < Label1.Text = "Система не имеет решения, поскольку\n\n" + "определитель равен нулю"; return; >// Получение обратной матрицы оА: Object oA = XL1.Application.WorksheetFunction.Minverse(A); // Умножение обратной матрицы на вектор свободных членов Object[,] X = XL1.Application.WorksheetFunction.MMult( oA, XL1.Application.WorksheetFunction.Transpose(L)); // ТАК НАПИСАТЬ ПРАВОМОЧНО // double X1 = (double)X[1, 1] ; // Формирование ответа: Label1.Text = String.Format(«Неизвестные равны:\n\nX1 = ; X2 = ; X3 = .», X[l, 1], X[2, 1], X[3, 1]); > > > Как видно из текста программы, задаем прямую матрицу, причем присваиваем значения коэффициентов сразу при объявлении двумерного массива. Аналогично поступаем с вектором свободных членов. Согласно требованию объекта WorksheetFunction возвращаемые обратная матрица и вектор неизвестных должны быть объявлены как объектные переменные. Вначале вычисляем детерминант ( определитель) прямой матрицы, используя функцию MS Excel Mdeterm(). Если прямая матрица плохо обусловлена, т. е. определитель по абсолютному значению меньше 0.01, то выходим из процедуры и сообщаем пользователю в метке label1 что система не имеет решения. Если определитель матрицы больше 0.01, то с помощью функции MS Excel Minverse() находим обратную матрицу. Далее обратную матрицу с помощью функции MS Excel MMuit() умножаем на вектор неизвестных, но прежде его следует сделать вертикальным массивом с помощью функции MS Excel Transpose, т. е. транспонировать массив l. Следующим оператором форматируем ответ в метке label1. Результат работы программы приведен на рис. 9.6. Убедиться в работоспособности программы можно, открыв решение ExcelСЛАУ.sln в папке ЕхсеlСЛАУ. Рис. 9.6. Решение системы линейных алгебраических уравнений Как видим, довольно сложные задачи можно решать в коротенькой программе благодаря обращению к функциям MS Excel. Причем на компьютере, где будет работать данная программа, вовсе не обязательно должен быть инсталлирован MS Excel. Однако инсталляция вашей программы должна содержать соответсвующую dll—библиотеку. Пример 59. Построение диаграммы средствами MS Excel Очень часто необходимо изобразить на графике (диаграмме) какие-либо экономические показатели или технические измерения (геодезические, метрологические, астрономические), например, с целью принятия каких-либо решений, часто сделать это надо очень оперативно. Для этих целей в ячейки рабочего листа MS Excel можно ввести измеренные данные, а далее чтобы получить график, по­строенный по этим данным, воспользоваться пунктами меню Вставка | Диаграмма. В данном разделе я покажу, как можно очень быстро получить график (диа­грамму) из программы Visual С#2010, используя средства (объекты компонентной библиотеки) MS Excel. Запустим Visual Studio 2010, далее, поскольку экранная форма нам не нужна, выбираем новый проект из шаблона Console Application. Теперь к текущему про­екту добавим библиотеку объектов MS Excel. Для этого в пункте меню Project вы­берем команду Add Reference, далее на вкладке СОМ отметим библиотеку Micro­soft Excel 12.0 Object Library и щелкнем на кнопке ОК. Затем на вкладке программного кода введем текст, приведенный в листинге 9.6. Листинг 9.6. Построение диаграммы средствами MS Excel // Программа строит график (диаграмму) средствами объектов // компонентной библиотеки MS Excel using XL = Microsoft.Office.Interop.Excel; // Другие директивы using удалены, поскольку они не используются в данной программе namespace ЕхсеlГрафик < // Для подключения библиотеки объектов MS Excel в пункте меню Project // выберем команду Add Reference. Затем на вкладке СОМ дважды щелкнем // по ссылке на библиотеку Microsoft Excel 12.0 Object Library class Program < static void Main(string[] args) < XL.Application XL1 = new XL.Application(); XL1.Workbooks.Add(); //XL1.ActiveSheet.Range["A1"].Value = "Месяц"; XL1.ActiveSheet.Range["A2"].Value = "Март"; XL1.ActiveSheet.Range("A3").Value = "Anp"; XL1.ActiveSheet.Range("A4").Value = "Май"; XL1.ActiveSheet.Range("A5").Value = "Июнь"; XL1.ActiveSheet.Range("A6").Value = "Июль"; //XL1.ActiveSheet.Range("B1").Value = "Продажи:"; XL1.ActiveSheet.Range("B2").Value = 138; XL1. ActiveSheet.Range ("B3 ") . Value = 85; XL1.ActiveSheet.Range("B4").Value = 107; XL1.ActiveSheet.Range("B5").Value = 56; XL1.ActiveSheet.Range("B6").Value = 34; XL1.Charts.Add(); // Задаем тип графика "столбчатая диаграмма" (гистограмма): XL1.ActiveChart.ChartType = XL.X1ChartType.xlColumnClustered; // Отключаем легенду графика: XL1.ActiveChart.HasLegend = false; XL1.ActiveChart.HasTitle = true; XL1. ActiveChart. ChartTitle. Characters. Text = "ПРОДАЖИ ЗА ПЯТЬ МЕСЯЦЕВ"; // Подпись оси х XL1.ActiveChart.Axes(XL.XIAxisType.xlValue).HasTitle = true; XL1.ActiveChart.Axes(XL.XIAxisType.xlValue).AxisTitle. Characters.Text = "Уровни продаж"; // Подпись оси у XL1.ActiveChart.Axes(XL.XIAxisType.xlCategory).HasTitle = true; XL1.ActiveChart.Axes(XL.XIAxisType.xlCategory).AxisTitle. Characters.Text = "Месяцы"; // Сохранение графика в растровом файле: XL1.ActiveChart.Export("С:\\ЕхсеlГрафик.jpg"); XL1. Visible = true; >> > Вначале программного кода создаем объект Excel.Application и рабочую книгу. Далее заполняем ячейки первого листа: вначале в ячейки Ai пишем подпи ординат гистограммы, а в ячейки Bi — значения ординат. Затем задаем тип диаграммы— xlСolumnСlustered, что соответствует гистограмме (столбиковой диаграмме). Далее указываем название гистограммы и подписываем горизонтальную и вертикальную оси. Затем с помощью функции Export() сохраняем полученную диаграмму на диске в виде jpg-файла. Графическое отображение этого файла можно но посмотреть на рис 9.7. Далее делаем видимой (visible = true) построенную диаграмму на рабочем листе MS Excel. Убедиться в работоспособности программы можно, открыв решение ЕхсеlГрафик.sln в папке ЕхсеlГрафик. Рис. 9.7. Графическое отображение полученного jpg-файла Пример 60. Управление функциями AutoCAD из программы на Visual С# 2010 Если результатом работы вашей программы должен быть какой-либо векторный чертеж (техническая документация, строительный чертеж, географическая карта и проч.), то самый быстрый путь, создания такого приложения — это обращение к Функциям AutoCAD из вашей С#-программы. AutoCAD (Computer—Aided Design) — Это 2- и 3-мерная система автоматизированного проектирования и черчения. Эта сис­тема, также как и пакет приложений Microsoft Office, может являться сервером OLE-oбьектов, и его функции могут использоваться другими приложениями. Графическими примитивами векторной графики являются отрезки, дуги, окружности, тексты, которые можно выводить под различными углами к горизонту, и, может быть, еще некоторые простейшие геометрические фигуры. Чертеж, подлежащий построению, состоит из совокупности таких элементов. Программа на С#2010 путем обращения к соответствующим функциям AutoCAD формирует та­кой чертеж и записывает его в dwg-файл. Пользователь может просмотреть этот файл в среде AutoCAD, отредактировать его и вывести на печать. Приступаем к программированию поставленной задачи. Как обычно после запуска Visual Studio 2010, выбираем шаблон Windows Forms Application С#. Далее следует подключить библиотеку объектов AutoCAD, для этого в пункте меню Project выбираем команду Add Reference, затем на вкладке СОМ дважды щелкаем на ссылке AutoCAD 2000 Object Library. Эта ссылка соответствует файлу ACAD.TLD в соответствующей папке Program Files, где расположен результат инсталляции AutoCAD. Теперь после компиляции проекта в папке obj\x86\Debug явится файл Interop.AutoCAD.dll. Таким образом, мы подключили библиотеку объектов AutoCAD версии 2000 Если на вашем компьютере инсталлирована другая версия AutoCAD, то действуют аналогично. Программа, выводящая в dwg-файл два отрезка, а также две горизонтально и вертикально ориентированных строки текста, представлена в листинге 9.7. Листинг 9.7. Построение отрезков и двух строк текста в AutoCAD // Программа строит средствами объектов библиотеки AutoCAD элементарный // чертеж из отрезков и некоторого текста. Этот чертеж сохраняется в файле // формата DWG. Конкретнее: эта программа запускает AutoCAD 2000i, рисует // два отрезка, два текстовых объекта, сохраняет чертеж в файле С:\Чертеж.dwg //и завершает работу AutoCAD using System; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace АСАDЧертеж < // Следует подключить библиотеку объектов AutoCAD. Для этого надо выбрать // Project | Add Reference - вкладка COM - AutoCAD 2000 Object Library – OK public partial class Form1:Form < public Form1() < InitializeComponent(); AutoCAD.AcadApplication ACAD1 = new AutoCAD.AcadApplication(); AutoCAD.AcadDocuments Docs1 = ACAD1.Documents; AutoCAD.AcadDocument Docl = Docs1.Add(); // Видимость: ACAD1.Visible = true; // Точки: double[] T1 = < 10, 10, 0 >; double[] T2 = < 200, 200, 0 >; double[] T3 = < 200, 10, 0 >; double[] T4 = < 15, 200, 0 >; // Нарисовать отрезок от точки T1 до точки Т2: Doc1.ModelSpace.AddLine(Tl, T2); // Нарисовать отрезок красным цветом: Doc1.ModelSpace.AddLine(T2, Т3).Color = AutoCAD.ACAD_COLOR.acRed; // Горизонтальный текст (с разворотом 0 градусов) Doc1.ModelSpace.AddText(«Горизонтальный», Т4, 22); // Вертикальный текст с разворотом на 90 град = ПИ/2 Doc1.ModelSpace.AddText(«Вертикальный», T1, 22).Rotation = Math.PI / 2; // Сохраняем чертеж на диске: Doc1. SaveAs («С: \\Чертеж.dwg») ; ACAD1.Quit(); > > > Как видно из программного кода, весь процесс работы программы происходит cразу после выполнения процедуры InitializeComponent. Вначале создается объект клаcca AutoCAD.Application. Далее создаем коллекцию документов AcadDocuments и ,открываем (делаем активным) один документ предложением Docs .Add. Затем задаем видимость работы AutoCAD visible = True, при этом AutoCAD только мелькнет на экране. (Заметьте, что для конечной цели, т. е. для получения dwg-файла, видимость не обязательна.) Далее задаем четыре точки, которые будут участвовать в построении чертежа. Обратите внимание, что каждая точка имеет три ординаты, хотя мы собираемся строить плоский чертеж. Третью координату мы будем воспринимать, как напоминание того, что AutoCAD способен строить трехмерные чертежи. Затем рисуем два отрезка AddLine через точки T1, Т2 и Т2, Т3. Причем мы показали, как второй отрезок задать красным цветом. Далее подаем команду выводить текст горизонтально, затем другой текст — вертикально с разворотом на 90°, т. е. π/2. Затем, используя метод SaveAs, записываем построенный в документе чертеж в dwg-файл на логический диск С:. В результате работы этой программы получаем чертеж в системе AutoCAD, подобный представленному на рис. 9.8. Убедиться в работоспособности программы можно, открыв решение ACADЧертеж-sln в папке АСАDЧертеж. Рис. 9.8. Отображение полученного dwg-файла в системе AutoCAD Пример 61. Вызов MATLAB из вашей программы на Visual С# 2010 Можно вызывать MATLAB из вашей С#-программы. Среда MATLAB является стандартным мощным инструментом для работы в различных отраслях математики. При подготовке этого примера автор пользовался наиболее распространенной версией MATLAB 6.5. В данном примере продемонстрируем подготовку вводных данных для MATLAB, создание экземпляра объекта типа MATLAB и непосредственный вызов на выполнение. В результате мы увидим построение графика функции у = sin(x)•e — x . Для программирования этой задачи запустим Visual Studio 2010 и закажем новый проект шаблона Windows Forms Application С#. Из панели элеменов Toolbox перенесем командную кнопку Button, чтобы обращение к среде MATLАВ происходило при щелчке на этой кнопке и выглядело бы наиболее выразительно. Далее на вкладке программного кода введем текст из листинга 9.8. Листинг 9.8. Использование возможностей среды MATLAB // Программа, подготовив соответствующие команды для MATLAB, вызывает // его на выполнение этих команд. В результате строится затухающая // синусоида у = sin(x)*ехр(-х) using System; using System.Windows.Forms; // Добавляем директиву System.Reflection: using System.Reflection; // Другие директивы using удалены, поскольку они не используются в данной программе namespace MatlabBызов < // Для успешной работы программы нет необходимости добавлять ссылку на // объектную библиотеку через Project | Reference. Однако на компьютере // MATLAB должен быть установлен public partial class Form1 : Form < public Form1() < InitializeComponent(); Button1.Text = "Вызвать MATLAB"; >private void button1_Click(object sender, EventArgs e) < // Получить тип приложения MATLAB: Type ТипМатЛаб = Type.GetTypeFromProgID("Matlab.Application"); // Создать экземпляр объекта типа MATLAB: object МатЛаб = Activator.Createlnstance(ТипМатЛаб); // Подготавливаем команды для MATLAB: object[] Команды = new Object[] // < "surf(peaks)" >; < "x = 0:0.1:6.28; у = sin(x)*exp(-x); plot(x,y)" >; // < "s = sin(0.5); с = cos(0.5); у = s*s+c*c; y" >; // Вызываем MATLAB, подавая ему на вход подготовленные команды: object Результат = ТипМатЛаб.invokeMember(«Execute», BindingFlags.InvokeMethod, null, МатЛаб, Команды); // MessageBox.Show(Результат.ToString()); > > > Как видно из текста программы, при обработке события «щелчок на кнопке» переменную ТипМатЛаб получаем тип приложения MATLAB. Далее создаем экземпляр объекта этого типа. Затем подготавливаем три команды для MATLAB, разделенные точкой с запятой. Первая команда «х = 0:0.1:6.28;» задает вектор х (набор чисел) от нуля до 2π (6,28) с шагом 0,1. Вторая команда «у = sin(x) *eхр(-х);» вычисляет второй вектор по значениям первого вектора. Третья команда plot создает график зависимости у от х. Метод Execute выполняет в среде MATLAB подготовленные команды. В результате обращения к MATLAB получим построенный график заданной функции (рис. 9.9). В комментариях приведены и другие команды, которые можно выполнить, подключаясь к среде MATLAB. Убедиться в работоспособности программы можно, открыв решение MatlabBызов.sln в папке MatlabBызов. Рис. 9.9. График функции, построенный в среде MATLAB Пример 62. Решение системы уравнений путем обращения к MATLAB Основной особенностью языка MATLAB являются его широкие возможности работе с матрицами, которые создатели языка выразили в лозунге «Думай векторно » (от англ. Think vectorized). Изначально среда MATLAB эволюционизировалась с задач матричной алгебры, отсюда и слово MATLAB означает матричная лаборатория (matrix laboratory). Решить систему уравнений, глядя на предыдущий пример, очень просто, нужно всего лишь знать, как строятся команды в MATLAB. Продемонстрируем процесс решения системы линейных уравнений на следующем примере. X1 + Х2 + Х3 =6 X1 + Х2 =3 Х2 + Х3 =5 Данную систему решим через обратную матрицу. Для программирования этой задачи запустим Visual Studio 2010 и закажем новый проект шаблона Windows Forms Application С#. Из панели элементов Toolbox перенесем командную кнопку Button. Далее на вкладке программного кода введем текст из листинга 9.9. Листинг 9.9. Решение системы линейных уравнений с помощью MATLAB // Программа, подготовив команды для решения системы уравнений в среде // MATLAB, вызывает его на выполнение этих команд. В результате получаем // решение, которое выводим на экран с помощью MessageBox using System; using System.Reflection; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace MatlabСЛАУ < public partial class Form1:Form < ^ public Form1() < InitializeComponent(); Button1.Text = "Решить СЛАУ"; >private void button1_Click(object sender, EventArgs e) < // Матричное уравнение АХ = L решаем через // обратную матрицу: X = A(-1)L. // Здесь (-1) - "знак" обратной матрицы. // Решаем систему // XI + Х2 + Х3 = 6 // XI + Х2 =3 // Х2 + ХЗ = 5 // Для решения этой системы в MATLAB следует подать такие команды: // А = [1 1 1; 1 1 0; 0 1 1]; L = [6; 3; 5]; // % здесь задание прямой матрицы А и вектора свободных членов L // X = inv(A)*L % умножение обратной матрицы на L" >; //%- это признак комментария в MATLAB // Получить тип приложения MATLAB: Туре ТипМатЛаб = Type.GetTypeFromProgID(«Matlab.Application»); // Создать экземпляр объекта типа MATLAB: object МатЛаб = Activator.Createlnstance(ТипМатЛаб); // Подготавливаем команды для MATLAB: object[] Команды = new Object[] < "А = [1 1 1; 1 1 0; 0 1 1]; L = [6; 3; 5]; " + "X = inv(A)*L % обратная матрица inv" >; // Вызываем MATLAB, подавая ему на вход подготовленные команды: object Результат = ТипМатЛаб.InvokeMember(«Execute», BindingFlags.InvokeMethod, null, МатЛаб, Команды); // Таким образом мы могли бы вывести решение на экран: // MessageBox.Show(Результат.ToStringf)); // Однако этот результат будет внутри строки, а хотелось бы // получить ответ в массив double для дальнейшей обработки. // Этот массив можно получить методом GetFullMatrix из среды // MATLAB, как показано ниже var p = new ParameterModifier(4); p[0] = false; p[1] = false; p[2] = true; p[3] = true; ParameterModifier[] mods = < p >; double[,] X = new double[3, 1]; object[] Аргументы = new object[] < "X", "base", X, new double[0] >; // Здесь «X» — это название матрицы, которую мы хотим получить. // «base» является названием рабочей среды MATLAB, где следует // искать матрицу «X». Результат = ТипМатЛаб.InvokeMember(«GetFullMatrix», BindingFlags. InvokeMethod, null, МатЛаб, Аргументы, mods, null, null); // Решение системы получаем в матрицу X: X = (double[,](Аргументы[2]; string Строка = string.Format(«X1 = ; Х2 = ; Х3 = ;», Х[0, 0] , Х[1, 0], Х[2, 0]); MessageBox.Show(Cтрока); > > > Как видно из программного кода, подход к решению задачи аналогичен предущему примеру. Мы реализовали обращение к MATLAB, используя метод Execute, решение системы получили в переменную Результат. И, как показано в комментарии, можем вывести результат вычислений на экран с помощ MessageBox. Однако для дальнейшей работы с полученным вектором неизвестных желательно иметь его в виде массива Double, а не в виде строки. Конечно, можно выделить из строки решения каждое значение неизвестного с помощью операций со строками, используя функцию Split, которая возвращает строковый массив, содержащий подстроки данного экземпляра. Однако существует более красивое решение. Оно заключается в иcпoльзoвaнии метода GetFullMatrix. Технологию этого использования мы привели в данной программе. Здесь наиболее важным параметром является объектная переменная Аргументы. Ее первым компонентом является компонент «X«, содержащий название матрицы, которую мы хотим получить из среды MATLAB, второй компонент «base» является названием рабочей среды (workspace) MATLAB, где следует искать матрицу «X«. Согласно документации, в среде MATLAB мы имеем две основные рабочие среды: «base» и «global«. Третьим компонентом является массив х, куда получаем результат решения из среды MATLAB, а четвертым компонентом массив мнимой части решения, которой в нашей задаче нет, но для общности технологии требуется ее формальное присутствие. О других способах подключения к MATLAB можно узнать на сайте компании The Math Works, производителя MATLAB, www.mathworks.com. Убедиться в ботоспособности обсуждаемой программы можно, открыв решение MatlabCлay.sln в папке MatlabCлay.

    12.05.2015 142.81 Кб 24 Звіт по Практиці.docx

    30.08.2019 49.94 Кб 1 звіт по практиці.docx

    12.05.2015 69.08 Кб 8 Звіт.docx

    27.08.2019 39.65 Кб 1 Звичаї, Культура та побут запорізких козаків(ГО. docx

    22.08.2019 185.34 Кб 0 здоровье.BK.doc

    01.09.2019 7.75 Mб 60 Зиборов.doc

    25.08.2019 90.11 Кб 7 ЗМУ.doc

    17.03.2016 89.25 Кб 15 змыст.docx

    15.07.2019 1.9 Mб 0 ЗОШИТ З УКР МОВИ 6_КЛАС.rtf

    12.05.2015 15.03 Кб 44 Зразок звіту.docx

    17.03.2016 36.35 Кб 42 зразок оформлення реферату.doc

    Ограничение

    Для продолжения скачивания необходимо пройти капчу:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *