1. Вступление
Привет всем!
Ранее мной была написана статья о создании расширения для Microsoft Excel на C#, где я описывал, как с помощью библиотеки Excel-DNA можно создать надстройку, с добавлением пользовательского интерфейса на ленту, и дополнительные функции, для приложения Microsoft Excel. Библиотека Excel-DNA, надо сказать, очень неплохая библиотека, но она имеет как свои плюсы, так и очень существенные минусы.
К плюсам этой библиотеки можно отнести то, что она позволяет создавать расширения для Excel начиная с версии 2007 и выше. Так же плюсом является довольно простой интерфейс для создания дополнительных пользовательских функций, позволяя расширить и существенно улучшить встроенный набор функций Excel. Но, на этом, собственно, плюсы и заканчиваются.
А теперь минусы.
Создание визуального интерфейса надстройки на пользовательскую ленту уже не такое удобное и требует дополнительного стороннего приложения в виде какого-нибудь ribbon xml editor, если Вы, конечно, не желаете довольно досконально изучить все особенности xml-разметки ленты ribbon, чтобы создавать её самому, как говориться, ручками. Хотя, если Вы это действительно изучите, то Вам будет конечно же большой плюс.
Но, кроме не самого приятного способа создания пользовательского интерфейса, ещё и взаимодействие с ним не очень удобное. Дело в том, что прямой доступ к ленте ribbon, при использовании библиотеки Excel-DNA, крайне ограничен, и некоторые взаимодействия с элементами на этой ленте можно произвести только посредством хитрых конструкций, основанных на обработчиках событий, да и то надёжность этих конструкций вызывает вопросы.
Ну и ещё один довольно большой минус — это то, что эта библиотека позволяет создавать надстройки исключительно только для Excel, лишая всякой возможности создать надстройку, скажем, для Word. Кстати, именно это ограничение всё время и мотивировало меня найти какую-либо более универсальную технологию для создания надстроек. И такой технологией оказалось VSTO расширение для Microsoft Office.
2. VSTO расширения для Microsoft Office
Что же такое VSTO? VSTO это Visual Studio Tools for Office, то есть это набор инструментов визуальной среды разработки приложений Visual Studio для Office.
Вообще VSTO не является чем-то совсем уж новым, расширения VSTO можно было создавать еще для Office 2013. Но, что важно, не ниже. И это как раз то, что является его довольно большим минусом. Проблема заключается в том, что в организациях, которые когда-то закупили лицензионный Office 2007, он чаще всего так до сих пор и работает. А что, простой, надежный, без лишних прибамбасов, можно сказать на 100% покрывающий все потребности работы с документами, и закупка более новой версии в целом, вроде как и не имеет смысла, можно сказать пустая трата денег. Но вот расширения VSTO на них встанут едва ли, только если может быть с помощью каких-нибудь «костылей». Так что, если появилась потребность в создании собственных надстроек в приложениях Microsoft Office, то это можно считать существенным мотивом к обновлению ПО, если оно не соответствует требованиям.
Как можно понять из названия VSTO, для его создания в первую очередь конечно же нужен Visual Studio,
на данный момент актуальной версией которой является 2019, и его дополнительный инструмент «Разработка надстроек для Office и SharePoint«.
Добавляемые при этом в Visual studio дополнительные шаблоны и предоставляют наборы инструментов для создания надстроек к Word, Excel, PowerPoint и многих других приложений Microsoft.
Так же в дальнейшем наверняка понадобится инструмент для установки своих созданных надстроек на другие компьютеры, и для этого подойдет расширение «Microsoft Visual Studio Installer Projects«,
которое можно установить с помощью инструмента «управление расширениями«.
Надстройку для Office можно создавать как на уровне документа, то есть эта надстройка будет запущена только при открытии конкретного документа, в котором она была создана, так и на уровне приложения, когда надстройка будет запускаться вместе с приложением независимо от открываемого документа.
Принцип создания надстройки для всех приложений (Word, Excel, PowerPoint и т.д.) в общем-то одинаковый. Для начала создаётся некий интерфейс на пользовательскую ленту инструментов, а затем обрабатываются события, инициируемые элементами этого созданного интерфейса, например, нажатие кнопки. Фактически создание надстройки отличаются в основном только объектной моделью приложения, поэтому, прежде чем создавать надстройку, скажем для Word, вначале нужно изучить объектную модель Word, структуру его документа и API, предоставляющий набор методов для работы с ним. Разумеется, то же касается и остальных приложений пакета Microsoft Office.
Кстати у технологии VSTO я вижу еще один минус. Я пока что так и не нашел, как с помощью VSTO просто расширить набор функций Excel, как это возможно посредством библиотеки Excel-DNA, а ведь это весьма полезная функция.
3. Приступаем к разработке надстройки
А теперь пример создания очень простенькой надстройки для Word, которая все что и будет уметь делать, так это вставлять в документ в текущую позицию фразу «Привет Мир!», ну или за место слова «Мир» будет вставляться указанное имя. При этом можно будет оценить преимущества разработки расширений VSTO по отношению к библиотеке Excel-DNA, если Вы читали мою статью об этой библиотеке.
И так, после того как инструмент «Разработка надстроек для Office и SharePoint» будет добавлен в Visual Studio, в нём появятся множество дополнительных шаблонов. Среди этих шаблонов нас в данный момент интересует шаблон «Надстройка VSTO для Word«.
Кстати, как можно увидеть на изображении выше, рядом так же находятся шаблоны для создания Документа VSTO для Word, и Шаблона VSTO для Word, которые позволяют соответственно создать конкретный документ Word, расширенный дополнительным функционалом, или шаблон документа, который далее будет генерировать документы Word.
Создадим новый проект надстройки VSTO для Word и назовём его «HelloWoldAddIn», на что в ответ будет получен следующий автоматически сгенерированный код:
Код на C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Word = Microsoft.Office.Interop.Word;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Word;
namespace HelloWoldAddIn
{
public partial class ThisAddIn
{
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region Код, автоматически созданный VSTO
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
}
}
Класс ThisAddIn, который был автоматически создан, является наследником класса Microsoft.Office.Tools.AddInBase, который, в свою очередь, предоставляет доступ к объектной модели текущего приложения посредством поля Application, возвращающего объект, представляющий экземпляр этого приложения.
Изначально в этом классе представлены всего лишь два обработчика событий — ThisAddIn_Startup, выполняющий код при загрузке надстройки и позволяющий произвести какую-либо инициализацию этой надстройки при запуске приложения. И ThisAddIn_Shutdown, который наоборот выполняет код перед закрытием приложения, и позволит сохранить настройки Вашей надстройки.
Но, с помощью только этих двух обработчиков многого не сделаешь, для работы нужна хотя бы одна какая-нибудь кнопка, которую можно было бы нажать в нужный момент работы с документом. И эту кнопку конечно же можно создать на ленте пользовательского интерфейса. Поэтому следующая задача — добавить в проект «Ленту«, и чтобы было удобнее её редактировать, стоит выбрать именно ленту в визуальном конструкторе,
после чего, собственно, и появится конструктор вкладки TabAddIns на ленте, пока еще пустой. Эту вкладку представляет класс Ribbon1, который является наследником класса Microsoft.Office.Tools.Ribbon.RibbonBase, который, в свою очередь, представляет базовый класс для настроек ленты Microsoft Office.
Далее, используя возможности визуального конструктора, панель элементов и поле свойства элементов, не составит никакого труда создать визуальный вид своей будущей надстройки.
И вот теперь в надстройке наконец-то появилась такая нужная нам кнопка, которую я назвал «Привет Мир!». Так же, для небольшой демонстрации некоторых возможностей, я сразу же добавил текстовое поле «Имя», из которого будет браться указанное имя для замены слова «Мир» во вставляемой этой надстройкой фразе.
При желании можно изменить имя группы вкладки, я свою группу назвал просто «Моя надстройка», а также можно переименовать саму вкладку, имя по умолчанию которой «TabAddIns». Если оставить имя как есть, то надстройка появиться в ленте на общей вкладке под названием «Надстройки», если же переименовать, то название вкладки, в которой появиться надстройка, соответственно измениться.
Далее эту ленту, а точнее вкладку на ленте, надо добавить к нашей надстройке и сделать это можно в переопределенном методе CreateRibbonExtensibilityObject.
protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
Ribbon1 ribbon = new Ribbon1();
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
}
И теперь, запустив приложение кнопкой Пуск,
откроется приложение Word, в котором уже можно найти созданную надстройку.
Правда толку от нее мало, кнопка пока что еще не работает. Поэтому, для того чтобы надстройка заработала, осталось на кнопку «Привет мир» добавить какой-нибудь программный код. Для этого находим эту кнопку в конструкторе, и, дважды на неё нажав мышкой, добавляем ей обработчик события, начальный код которого генерируется в классе ленты Ribbon1.
Но далее возникает одна проблемка. Сама лента Ribbon не имеет доступа к Application, и соответственно не может получить экземпляр текущего приложения для работы с ним и его документами. Так что писать код обработчика события нажатия кнопки прямо в классе Ribbon это плохая идея. Но это проблема решается довольно просто — нужно добавить новое событие, например, ButtonClicked, самому классу Ribbon, и при нажатии кнопки на ленте запустить обработчик этого нового события. А сам программный код этого обработчика определить в классе ThisAddIn, который уже вполне имеет доступ к Application. И кроме того, через этот обработчик, основанный на стандартном делегате Action, в класс ThisAddIn можно передать экземпляр текущего класса Ribbon, что позволит получить полноценный доступ к своей вкладке на ленте и всем её компонентам.
public partial class Ribbon1 {
public event System.Action<Ribbon1> ButtonClicked;
private void Ribbon1_Load(object sender, RibbonUIEventArgs e) {
}
private void btnHelloWorld_Click(object sender, RibbonControlEventArgs e) {
ButtonClicked?.Invoke(this);
}
}
public partial class ThisAddIn
{
. . .
protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
Ribbon1 ribbon = new Ribbon1();
ribbon.ButtonClicked += Ribbon_ButtonClicked;
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
}
private void Ribbon_ButtonClicked(Ribbon1 ribbon) {
// Если в текстовом поле на ленте указано имя, то возьмем его. Иначе имя будет Мир.
string _name = ribbon.ebHelloWorld.Text == "" ? "Мир" : ribbon.ebHelloWorld.Text;
// Вставим в текущую позицию текст "Привет" и определенное выше имя.
Application.Selection.Text = $"Привет {_name}!";
}
}
Ну вот надстройка и готова, осталось её запустить, и проверить её работу.
Да, кстати, после того как Вы протестируете надстройку, она останется в приложении Word и после закрытия Visual Studio, что не совсем правильно, так как эта надстройка пока еще только тестовая. Поэтому перед тем как завершить работу в Visual Studio не забудьте очистить собранный проект.
4. Дополнительные возможности надстройки
Надстройки VSTO удобны тем, что они позволяют использовать практически любые библиотеки и возможности NET Framework, версию которой Вы выберите перед началом создания надстройки. А это значит, что при желании Вы можете в документ загрузить какую-нибудь информацию, например, из базы данных или прямо с интернета, можете отправить что-нибудь из документа по электронной почте или даже наоборот получить электронную почту сразу в свой документ.
И конечно же имея такие возможности, наверняка рано или поздно возникнет вопрос с хранением некоторых настроек. Ну, в случае VSTO на уровне документа настройки, наверное, можно было бы хранить прямо в самом документе. В Word это может быть некоторый скрытый текст, с именованной закладкой для быстрого доступа к настройкам. В Excel можно использовать какую-либо ячейку. Но вот в надстройках VSTO на уровне приложения конкретного документа нет. Поэтому в этом случае для хранения настроек подойдёт системный реестр или просто обычный текстовый документ, расположенный, например, в документах текущего пользователя. Вот, как-то так:
Код на C#
public partial class ThisAddIn
{
const string FILE_NAME = "HelloWordAddIn.txt";
string name = "";
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
name = LoadName();
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}
#region Код, автоматически созданный VSTO
/// <summary>
/// Требуемый метод для поддержки конструктора — не изменяйте
/// содержимое этого метода с помощью редактора кода.
/// </summary>
private void InternalStartup()
{
this.Startup += new System.EventHandler(ThisAddIn_Startup);
this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
}
#endregion
protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
Ribbon1 ribbon = new Ribbon1();
ribbon.ButtonClicked += Ribbon_ButtonClicked;
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
}
private void Ribbon_ButtonClicked(Ribbon1 ribbon) {
// Определим какое имя должно быть указно при нажатии кнопки.
string _name =
ribbon.ebHelloWorld.Text == "" ? (string.IsNullOrEmpty(name) ? "Мир" : name)
: ribbon.ebHelloWorld.Text;
// Вставим в текущую позицию текст "Привет" и определенное выше имя.
Application.Selection.Text = $"Привет {_name}!";
}
/// <summary>
/// Получает имя из файла в директории "Мои документы"
/// </summary>
/// <returns></returns>
private string LoadName() {
string _name = "";
// Для начала надо узнать путь к директорию "Мои документы"
// текущего пользователя,
string myDocuments =
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
// и сформировать полный путь к текстовому файлу,
// в котором должно быть указано имя.
string path = $@"{myDocuments}{FILE_NAME}";
// Если этого файла нет,
if (!File.Exists(path))
// то надо его создать, и сразу закрыть.
File.Create(path).Close();
try {
// Далее надо открыть текстовый файл,
using (StreamReader sr =
new StreamReader($@"{myDocuments}{FILE_NAME}", Encoding.UTF8)) {
// и считать из него указанное имя.
_name = sr.ReadLine();
}
} catch (FileNotFoundException) {
// Если во время открытия файла возникла ошибка,
// значит пусть имя останется пустым.
_name = "";
}
return _name != null ? _name : "";
}
}
В этом коде был добавлен метод LoadName, который находит в директории документов пользователя файл «HelloWordAddIn.txt» и считывает из него имя, которое нужно поприветствовать. Чтобы постоянно не обращаться к файлу, имя считывается один раз при запуске настройки из метода ThisAddIn_Startup, и запоминается в глобальной переменной name, к которой уже в любой момент могут обратиться все желающие.
Единственное что ещё хотелось бы сделать, так это инициализировать пользовательский интерфейс надстройки при запуске, то есть, если в файле настроек указано имя, то чтобы это имя сразу же отображалось в текстовом поле в надстройке на пользовательской ленте.
Сделать это можно в классе ленты Ribbon в методе Ribbon1_Load, который срабатывает при загрузке ленты в приложении Office. Но делать это прямо в классе ленты опять же будет не целесообразно, так как прямой связи с классом ThisAddIn он не имеет, а ведь именно в нём находятся данные для загрузки имени из файла. Зато есть смысл добавить классу Ribbon ещё одно событие RibbonLoad, обработчик которого будет запускаться при загрузке ленты.
И тогда класс Ribbon примет следующий вид:
public partial class Ribbon1 {
public event System.Action<Ribbon1> RibbonLoad;
public event System.Action<Ribbon1> ButtonClicked;
private void Ribbon1_Load(object sender, RibbonUIEventArgs e) {
RibbonLoad?.Invoke(this);
}
private void btnHelloWorld_Click(object sender, RibbonControlEventArgs e) {
ButtonClicked?.Invoke(this);
}
}
а в классе ThisAddIn тогда немного изменится метод CreateRibbonExtensibilityObject.
protected override IRibbonExtensibility CreateRibbonExtensibilityObject() {
Ribbon1 ribbon = new Ribbon1();
ribbon.RibbonLoad += Ribbon_RibbonLoad;
ribbon.ButtonClicked += Ribbon_ButtonClicked;
return Globals.Factory.GetRibbonFactory().CreateRibbonManager(
new Microsoft.Office.Tools.Ribbon.IRibbonExtension[] { ribbon });
}
В нем добавляется обработчик на новое, только что созданное, событие. И, соответственно, добавиться метод Ribbon_RibbonLoad,
/// <summary>
/// Обработка события возникающего при загрузке надстройки на ленте Ribbon
/// </summary>
/// <param name="ribbon"></param>
private void Ribbon_RibbonLoad(Ribbon1 ribbon) {
ribbon.ebHelloWorld.Text = name;
}
в котором и происходит инициализация пользовательского интерфейса ленты, а точнее, перед открытием приложения в текстовое поле заносится указанное в файле имя.
5. Ручная установка надстройки
Теперь, когда надстройка готова, её надо установить. Для того чтобы Microsoft Word увидел и подключил надстройку на другом компьютере, проект надстройки надо собрать уже не в режиме разработки (Debug), а в режиме развертывания (Release). В выходном каталоге, примерно где-то здесь: C:UsersUsersourcereposHelloWoldAddInHelloWoldAddInbinRelease, будут скомпилированы несколько файлов. Нас интересуют четыре из них:
- HelloWoldAddIn.dll
- HelloWoldAddIn.dll.manifest
- HelloWoldAddIn.vsto
- Microsoft.Office.Tools.Common.v4.0.Utilities.dll
Все эти четыре файла нужно скопировать куда-нибудь в одну папку. Но, для того чтобы Word увидел надстройку, нужна еще соответствующая запись в системном реестре. А точнее, в ветке реестра HKEY_CURRENT_USERSoftwareMicrosoftOfficeWordAddins (если приложение Excel, то и ветка соответствующая), нужно добавить раздел нашей надстройки, например, HelloWoldAddIn. В этом разделе нужно создать четыре параметра:
- строковый параметр «Description»
- строковый параметр «FriendlyName»
- параметр DWORD (32 бита) «LoadBehavior»
- строковый параметр «Manifest»
и заполнить их примерно как указано на изображении ниже.
Параметр «Description» — это понятно, описание надстройки.
Параметр «FriendlyName» — это то, как надстройка будет выглядеть в списке надстроек в приложении Microsoft.
Параметр «LoadBehavior» равный 3 означает, что надстройка включена.
Самый сложный получается параметр «Manifest«, тут указан путь к файлам надстройки. Но, надо обязательно учесть, что перед началом пути стоит префикс «file:///», да-да, именно с треся слешами, а в конце пути указан суффикс «|vstolocal» и именно с «пайпом» в начале суффикса. А сам путь должен указывать на конкретный файл с расширением «vsto».
Если Вы все правильно сделаете, то запустив приложение Word, после нескольких предупреждений о нарушении безопасности, на ленте интерфейса Вы увидите свою надстройку. А если зайти в параметры Word, то на вкладке «Надстройки» будет информация о добавленной надстройке.
Так же, если зайти в «Управление надстройками COM«, то в списке надстроек будет отображаться Ваша надстройка, которую при желании можно временно отключить, убрав галочку напротив неё.
Если параметры реестра прописаны в ветке «HKEY_CURRENT_USER«, то надстройка будет доступна только текущему пользователю Windows, а если те же параметры прописать в ветке «HKEY_LOCAL_MACHINE«, то надстройка станет доступна для всех пользователей системы.
6. Установка надстройки с помощью установщика Windows
Но конечно же устанавливать надстройку вручную очень неудобно, поэтому гораздо лучше создать установщик, который всё сделает сам. Поэтому, если Вы все ещё не установили себе расширение «Microsoft Visual Studio Installer Projects«, то самое время это сделать.
Далее надо добавить проект установщика (Setup Project) в решение,
после чего сразу откроется вкладка «File System«. Если же она не открылась, то открыть её можно самому, нажав правой кнопкой мыши на проекте установщика, и в появившемся меню из «View» выбрать пункт «Файловая система«.
Во вкладке файловой системы надо указать, какие файлы нужны для работы. Для этого надо вызвать меню правой кнопкой мыши на разделе «Application Folder«, и из пункта «Add» выбрать подпункт «Выходной элемент проекта…«.
Появится окно «Добавление выходной группы проекта«, в котором надо выбрать пункт «Основные выходные файлы» и нажать кнопку «ОК».
После этого в разделе «Application Folder» появится список файлов. Это и есть те файлы, которые далее будут скопированы в рабочий раздел надстройки, и которые должны отвечать за её работу.
Но этот список надо немного скорректировать, что-то надо в него добавить, а что-то из него удалить. А именно.
В этом списке в данный момент не хватает двух важных файлов манифеста надстройки Word:
- HelloWoldAddIn.dll.manifest
- HelloWoldAddIn.vsto
Чтобы их добавить нужно снова вызвать контекстное меню раздела «Application Folder» и из пункта меню «Add» выбрать теперь уже подпункт «Файл…«. Откроется окно выбора файлов, в котором надо найти эти файлы манифеста. Найти их можно, как я уже указывал ранее, в выходном каталоге проекта надстройки, примерно где-то здесь: C:UsersUsersourcereposHelloWoldAddInHelloWoldAddInbinRelease. Если этот каталог пустой, значит Вы просто забыли собрать проект надстройки в режиме развертывания (Release), сделайте это. А далее надо добавить эти два файла в список выходных файлов.
А теперь в списке ещё остались файлы, которые в рабочем каталоге надстройки совершенно не нужны, их надо исключить из списка выходных файлов. Это удобнее делать из окна «Обозревателя решений«. Чтобы исключить файл из списка надо выбрать его в обозревателе, после чего в окне свойств установить значение параметра «Exclude» в True. После этого этот файл в «Обозревателе решений» примет вид как исключённый, а из списка выходных файлов и вовсе исчезнет.
Исключить из списка нужно все файлы из-под раздела обнаруженных зависимостей («Detected Dependencies»), за исключением платформы «Microsoft .NET Framework» или любой сборки, завершающейся ** *.Utilities.dll**
Должно получиться примерно вот так:
Сразу же можно настроить путь к выходным файлам надстройки. Для этого надо выбрать раздел «Application Folder«, после чего в окне свойств в параметре «DefaultLocation» можно будет увидеть шаблон пути: [ProgramFiles64Folder][Manufacturer][ProductName].
ProgramFiles64Folder или ProgramFilesFolder означает путь к директорию Program Files, или Program Files (x86), смотря какую платформу Вы выберите, 64-битную или 32-битную.
Параметры «Manufacturer» и «ProductName» — это переменные, которые можно настроить в окне свойств проекта установщика, после того как будет выбран корень проекта «HelloWorldAddInSetup«.
Здесь же с помощью параметра «TargetPlatform» выбирается платформа, 64-битная (x64) или 32-битная (x86), это важно и зависит от того, для какого офиса будет устанавливаться надстройка, для 64-битного или 32-битного.
Не менее важным параметром является параметр «Version«, который влияет на то, будут ли при переустановке надстройки уже существующие файлы заменены, или будет отображено сообщение, что более новая версия уже установлена. При изменении этого параметра, будет предложено автоматически изменить значение параметра «ProductCode«, сформировав новый уникальный код. Ориентируясь на этот код, установщик будет принимать решение, устанавливается ли измененная надстройка или производится попытка ещё раз установить ту же самую надстройку. Если код разный, то далее уже делается проверка номера версии устанавливаемой надстройки, выше она, уже установленной, или ниже.
Так же здесь настраивается переменная «Author«, которую тоже можно использовать в шаблоне пути выходных файлов.
Еще полезные параметры, которые будут видны при установке надстройки, это «Description» — описание надстройки и «Title» — всплывающая подсказка к надстройке.
Как можно вспомнить из раздела ручной установки надстройки, для её работы кроме файлов нужна ещё запись в системном реестре. Для программной установки записи в реестр надо правой кнопкой вызвать контекстное меню на заголовке проекта установщика, и далее из меню «View» выбрать подменю «Реестр«.
Откроется вкладка Реестра (Registry), в двух ветках которой уже будут начальные записи.
Запись в ветке реестра HKEY_CURRENT_USER означает, что настройка будет установлена только для текущего пользователя. А ветка HKEY_LOCAL_MACHINE — что надстройка будет установлена для всех пользователей операционной системы. Но, в любом случае, начальные записи не верны, поэтому раздел «[Manufacture]» можно смело удалять из обоих веток.
Далее надо решить, будет ли всё-таки устанавливаться надстройка для всех или только для текущего пользователя, и выбрать для дальнейшей работы соответствующую ветку HKEY. В этой ветке к разделу «Software» надо последовательно добавить разделы, чтобы получился следующий путь: HKEY_*SoftwareMicrosoftOfficeWordAddInsParadox.HelloWorldAddIn. Понятно, что в этом пути Word означает надстройку для приложения Microsoft Word, и если надстройка создается, например, для Excel, то за место Word надо указать Excel. А раздел с именем «Paradox.HelloWorldAddIn» это уже непосредственно сама надстройка и может быть названа как угодно по своему усмотрению, но обычно её имя строится из названия организации или автора и названия надстройки через точку.
После того как путь будет построен, в разделе «Paradox.HelloWorldAddIn» следует создать четыре параметра:
- строковый параметр «Description»
- строковый параметр «FriendlyName»
- параметр DWORD (32 бита) «LoadBehavior»
- строковый параметр «Manifest»
и заполнить их аналогично, как это описано в ручной установке надстройки. Должно получиться примерно, как на изображении ниже.
Как можно заметить, в параметре «Manifest«, в отличии от ручной настройки, указан не путь к файлам надстройки, а переменная «[TARGETDIR]«, которая автоматически выстроит путь к директорию, куда будет установлена надстройка. А какой путь выстроит эта переменная, настраивается в свойствах «Application Folder» вкладки «File System» («Файловой системы«). По умолчанию это директорий с указанным наименованием организации и наименованием имени продукта в каталоге Program Files или Program Files (x86), в зависимости от того, какая платформа была выбрана.
Ну и в общем-то для сборки установщика почти всё готово. Можно ещё сделать проверку требуемой версии Microsoft .NET Framework. Для этого надо нажать правой кнопкой мыши на заголовке проекта установщика, в нашем случае это HelloWorldAddInSetup, и из контекстного меню выбрать пункт «Свойство«, после чего появиться окно страницы свойств установщика.
В этом окне надо нажать кнопку «Предварительные требования» (Prerequisites…), которое откроет окно «Необходимые компоненты«, в котором можно выбрать нужную версию .NET Framework, используемую при создании надстройки.
Так как моим приложениям часто приходиться работать на Windows 7, то я обычно рабою с .NET Framework версии 4.5.2.
Microsoft также при создании установщика для надстроек VSTO рекомендует настроить условия запуска для обнаружения среды выполнения VSTO. Но, для непосредственной установки надстройки, это не обязательно, если Вам будет интересно, то дополнительную информацию по настройке установщика можно найти на официальном сайте Microsoft. А без этих проверок надстройка после установки просто либо заработает, если у Вас Office 2013 или выше, или не заработает, если у Вас соответственно Office ниже версии 2013.
Всё, теперь надо убедиться, что режим компиляции установлен как Release и пересобрать проект установщика. В выходном каталоге проекта установщика надстройки будут созданы два файла — HelloWorldAddInSetup.msi и setup.exe, для установки надстройки можно использовать любой из них. Устанавливаем, запускаем Word и пользуемся.
07 декабря 2020 г.
title | description | ms.date | ms.topic | dev_langs | helpviewer_keywords | author | ms.author | manager | ms.technology | ms.workload | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Walkthrough: Create your first VSTO Add-in for Word |
Create an application-level Add-in for Microsoft Word. This feature is available to the application itself, regardless of which documents are open. |
02/02/2017 |
conceptual |
|
|
John-Hart |
johnhart |
jmartens |
office-development |
office |
Walkthrough: Create your first VSTO Add-in for Word
[!INCLUDE Visual Studio]
This introductory walkthrough shows you how to create a VSTO Add-in for Microsoft Office Word. The features that you create in this kind of solution are available to the application itself, regardless of which documents are open.
[!INCLUDEappliesto_wdallapp]
This walkthrough illustrates the following tasks:
-
Creating a Word VSTO Add-in project.
-
Writing code that uses the object model of Word to add text to a document when it is saved.
-
Building and running the project to test it.
-
Cleaning up the completed project so that the VSTO Add-in no longer runs automatically on your development computer.
[!INCLUDEnote_settings_general]
Prerequisites
You need the following components to complete this walkthrough:
-
[!INCLUDEvsto_vsprereq]
-
Microsoft Word
Create the project
To create a new Word VSTO Add-in project in Visual Studio
-
Start [!INCLUDEvsprvs].
-
On the File menu, point to New, and then click Project.
-
In the templates pane, expand Visual C# or Visual Basic, and then expand Office/SharePoint.
-
Under the expanded Office/SharePoint node, select the Office Add-ins node.
-
In the list of project templates, select a Word VSTO Add-in project.
-
In the Name box, type FirstWordAddIn.
-
Click OK.
[!INCLUDEvsprvs] creates the FirstWordAddIn project and opens the ThisAddIn code file in the editor.
Write code to add text to the saved document
Next, add code to the ThisAddIn code file. The new code uses the object model of Word to add boilerplate text to each saved document. By default, the ThisAddIn code file contains the following generated code:
-
A partial definition of the
ThisAddIn
class. This class provides an entry point for your code and provides access to the object model of Word. For more information, see Program VSTO Add-ins. The remainder of theThisAddIn
class is defined in a hidden code file that you should not modify. -
The
ThisAddIn_Startup
andThisAddIn_Shutdown
event handlers. These event handlers are called when Word loads and unloads your VSTO Add-in. Use these event handlers to initialize your VSTO Add-in when it is loaded, and to clean up resources used by your VSTO Add-in when it is unloaded. For more information, see Events in Office projects.
To add a paragraph of text to the saved document
-
In the ThisAddIn code file, add the following code to the
ThisAddIn
class. The new code defines an event handler for the xref:Microsoft.Office.Interop.Word.ApplicationEvents4_Event.DocumentBeforeSave event, which is raised when a document is saved.When the user saves a document, the event handler adds new text at the start of the document.
C#
:::code language=»csharp» source=»../vsto/codesnippet/CSharp/FirstWordAddIn/ThisAddIn.cs» id=»Snippet1″:::
VB
:::code language=»vb» source=»../vsto/codesnippet/VisualBasic/FirstWordAddIn/ThisAddIn.vb» id=»Snippet1″:::
[!NOTE]
This code uses an index value of 1 to access the first paragraph in the xref:Microsoft.Office.Interop.Word._Document.Paragraphs%2A collection. Although Visual Basic and Visual C# use 0-based arrays, the lower array bounds of most collections in the Word object model is 1. For more information, see Write code in Office solutions. -
If you are using C#, add the following required code to the
ThisAddIn_Startup
event handler. This code is used to connect theApplication_DocumentBeforeSave
event handler with the xref:Microsoft.Office.Interop.Word.ApplicationEvents4_Event.DocumentBeforeSave event.:::code language=»csharp» source=»../vsto/codesnippet/CSharp/FirstWordAddIn/ThisAddIn.cs» id=»Snippet2″:::
To modify the document when it is saved, the previous code examples use the following objects:
-
The
Application
field of theThisAddIn
class. TheApplication
field returns a xref:Microsoft.Office.Interop.Word.Application object, which represents the current instance of Word. -
The
Doc
parameter of the event handler for the xref:Microsoft.Office.Interop.Word.ApplicationEvents4_Event.DocumentBeforeSave event. TheDoc
parameter is a xref:Microsoft.Office.Interop.Word.Document object, which represents the saved document. For more information, see Word object model overview.
Test the project
To test the project
-
Press F5 to build and run your project.
When you build the project, the code is compiled into an assembly that is included in the build output folder for the project. Visual Studio also creates a set of registry entries that enable Word to discover and load the VSTO Add-in, and it configures the security settings on the development computer to enable the VSTO Add-in to run. For more information, see Build Office solutions.
-
In Word, save the active document.
-
Verify that the following text is added to the document.
This text was added by using code.
-
Close Word.
Clean up the project
When you finish developing a project, remove the VSTO Add-in assembly, registry entries, and security settings from your development computer. Otherwise, the VSTO Add-in will continue to run every time that you open Word on your development computer.
To clean up the completed project on your development computer
- In Visual Studio, on the Build menu, click Clean Solution.
Next steps
Now that you have created a basic VSTO Add-in for Word, you can learn more about how to develop VSTO Add-ins from these topics:
-
General programming tasks that you can perform in VSTO Add-ins: Program VSTO Add-ins.
-
Programming tasks that are specific to Word VSTO Add-ins: Word solutions.
-
Using the object model of Word: Word object model overview.
-
Customizing the UI of Word, for example, by adding a custom tab to the Ribbon or creating your own custom task pane: Office UI customization.
-
Building and debugging VSTO Add-ins for Word: Build Office solutions.
-
Deploying VSTO Add-ins for Word: Deploy an Office solution.
See also
- Office solutions development overview (VSTO)
- Word solutions
- Program VSTO Add-ins
- Word object model overview
- Office UI customization
- Build Office solutions
- Deploy an Office solution
- Office project templates overview
Probably many of us use some of the add-in on Microsoft Word. Add-in is like a plugin, which opens as taskpane within Microsoft Word and gives options of custom services or jobs, like selection of text like simple action to complex web API driven text analysis. Here is how to create Microsoft Word Add-in to get own custom functions and services in to Word. MS Word Add-in uses HTML, CSS and Js for Add-in. Previously, we published a short guide on Example of Using IBM Watson For Text Analysis with Google Docs, which used Apps Script. Apps Script is easy and far less featured than MS Word Add-in. However, developing Microsoft Word Add-in requires to get used with Word JavaScript API. In this guide, we will provide only the basic steps to get started. Microsoft has enough example sample Add-in to understand how to develop. Office Add-ins platform is quite interesting :
https://docs.microsoft.com/en—us/office/dev/add—ins/overview/office—add—ins |
We need to have Microsoft Visual Studio 2019 (community edition) installed. Within Visual Studio, install the Office/SharePoint development workload. Now, within the Visual Studio menu bar, go to File > New > Project.
Type SharePoint in the search and you will find Word Web Add-in as the project type. Click select and proceed to next step. Name the project, and then choose OK. You will select Web application project as type. Visual Studio creates a solution that contains two projects. Visual Studio creates a solution and its two projects appear in Solution Explorer.
Microsoft does have own guide for this development :
https://docs.microsoft.com/en—in/office/dev/add—ins/quickstarts/word—quickstart?tabs=visual—studio |
However, you’ll find that the new default “Word Add-In with Commands Sample” more nice to study along with the above text and basic sample. We have a home.html
file, a home.css
, a home.js
and finally a XML manifest file. The XML manifest file has least editing work.
The names of the files, such as home.html
, home.css
, home.js
quite meaningful – they are just like part of web application or web page development. The API reference of JavaScript API is most important :
https://docs.microsoft.com/en—us/office/dev/add—ins/reference/overview/word—add—ins—reference—overview |
In order to test, simply click the Start
option (with play icon) within the Microsoft Visual Studio IDE (Start is located at top, middle). At end, the loaded add-in will open on Microsoft Word. We have marked the location of the Start
option in the above screenshot.
Tagged With how to make a microsoft word plugin , how to create an add-in for microsoft word , create an addin for microsoft word , microsoft word plugin creator , how to make a word addon , how to create add ins for microsoft word , how to create an addin for ms word , how to add addin in word , how to add an add in in word , how to create word addin
Введение
Целью создания этой статьи является сделать мини- шпаргалку для создания надстроек VSTO, здесь я попытался объединить собранные разрозненные крупицы информации по созданию надстройки VSTO на языке C# для Excel. Статья не претендует на целостное описание процесса создания надстройки, это скорее, «дорожная карта» для новичков, здесь описывается как по шагам сделать простейшую надстройку над Excel.
Excel представляет собой офисный «швейцарский нож», которым можно решить огромный спектр задач для работы с разнообразными данными. Но, как правило, для простой рутинной работы требуется очень много последовательных действий, которые повторяются из документа в документ. Для облечения рутины в Excel есть инструмент написания макросов VBA, на котором можно выполнить решение по малой автоматизации, сверстать таблицу, поправить шрифты, убрать формулы с листа. Но ограничения VBA очень быстро напомнят о себе, когда макрос начнет разрастаться, потребуется подключения к базе данных компании, получать данные от стороннего интернет ресурса или есть необходимость скрыть исходный код. Еще одно преимущество С# это возможность портировать код макросов на альтернативный офисный пакет без существенных издержек.
Visual Studio Tools for Office (VSTO, Visual Studio Tools для офиса) представляет собой набор средств разработки, позволяющий использовать всю функциональность .NET Framework для написания пользовательских функций офисного пакета. Надстройки, написанные в VSTO, являются полноценными скомпилированными программами, которые дополняют функционал офисного пакета и кастомизируют бизнес-логику конкретной фирмы.
Процесс написания надстройки
Для начала необходимо создать проект и выбрать тип «Надстройка VSTO для Exсel» в нашей любимой, а может не очень Visual Studio 2022, при необходимости выполнить установку соответствующих компонентов. Далее на следующей странице ввести имя проекта и выбрать платформу .NET Framework 4.8, как самую последнею. Увы платформа ограничивает максимально доступную версию используемого языка С# не выше 7.3, и некий «синтаксический сахар» из последних версий будет недоступен, что немного огорчает.
Сразу же при создании проекта открывается файл ThisAddIn.cs, представляющий собой точку доступа к функциям листа Excel, один недостаток, эти функции доступны только в этом файле, и помочь в этом нам сможет следующий код:
//Возвращает объект приложение Excel
public Excel.Application GetApplication()
{
return Application;
}
//Возвращает объект активная рабочаяя книга
public Excel.Workbook GetActiveWorkBook()
{
return (Excel.Workbook)Application.ActiveWorkbook;
}
//Возвращает объект активный рабочий лист
public Excel.Worksheet GetActiveWorksheet()
{
return (Excel.Worksheet)Application.ActiveSheet;
}
//Возвращает объект активная ячейка
public Excel.Range GetActiveCell()
{
return (Excel.Range)Application.Selection;
}
И теперь прописав в любом месте в приложения ниже идущий код мы можем получить доступ к функциям Excel:
Application application = Globals.ThisAddIn.GetApplication();
Worksheet worksheet = Globals.ThisAddIn.GetActiveWorksheet();
Range cell = Globals.ThisAddIn.GetActiveCell();
Workbook workBook = Globals.ThisAddIn.GetActiveWorkBook();
Данный код проще всего добавить в абстрактный класс и от него наследовать все функции нашего приложения:
protected abstract class AbstractFunctions
{
protected readonly Application application = Globals.ThisAddIn.GetApplication();
protected readonly Worksheet worksheet = Globals.ThisAddIn.GetActiveWorksheet();
protected readonly Range cell = Globals.ThisAddIn.GetActiveCell();
protected readonly Workbook workBook = Globals.ThisAddIn.GetActiveWorkBook();
public abstract void Start();
}
Например, функция удаления формул на выделенном участке листа Excel будет выглядеть таким образом:
internal class DeleteFormula : AbstractFunctions
{
public override void Start()
{
cell.Value = cell.Value; //Удаляем формул
worksheet.get_Range("A1", Type.Missing).Select(); //Фокус на ячейку А1
}
}
Далее необходимо добавить ленту Ribbon (Visual Designer) на которой будут располагаться кнопки запуска наших приложений, тут тоже хитрого ничего нет, и добавляется на точно также, как и все элементы в проект:
Далее, в коде нашей ленты мы создаем обработчики нажатий на кнопки, я предпочитаю разносить функции по классам и использовать генерацию события нажатия на кнопку в методе Load(). Это значительно упрощает код визуально и облегчает внедрение зависимостей (Dependency injection):
public partial class Ribbon1
{
private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
{
button1.Click += (s, a) =>
{
DeleteFormyla deleteFormyla= new DeleteFormyla ();
DeleteFormyla.Start();
}
}
}
Однако, можно создать обработчик кнопок и нажатием двойным кликом, но как говорилось раньше это не самое красивое решение.
Теперь кульминация, запуск и.. Не работает, необходимо создать сертификат надстройки, заходим в Projects-Propertis-Signing, создаем тестовый ключ Create Test Certificate. И теперь Ваша надстройка успешно работает.
Таким образом, за минимум действий можно создать рабочую надстройку Excel.
In this series, I want to create a custom Word Add-In and then start to build a set of REST API that are deployed as AWS Lambda functions that will allow us to Save As New, Check-Out, Check-In, Save, Release, Revise, Search and Open a word document that utilizes the AWS S3 bucket as the storage medium. Of course we will also have to create a series of database tables to manage the life-cycle of the data, and build a WPF client side application to go along with it.
In this blog we will create the Custom Word Add-in and then the following blogs will focus on each function in turn until we have a fully functioning application.
Visual Studio Solution
The first thing we need to do is create a new Visual Studio Solution and add the following Solution Folders. This may not be the final structure but its a good start.
Visual Studio Project
On the Word Solution Folder, Right Mouse click and select New Project from the secondary contextual menu.
Select the Word VSTO Add-In project template and pick Next
Within the Project Name field key in the name of the Project, and select Create.
Next we will add the Ribbon (Visual Designer), to do this Right Mouse Click on the Project and select New Item… from the secondary contextual menu.
Select the Ribbon (Visual Designer) item template, then key in the name for the new item, and pick Add.
Editing the Ribbon Visual Designer
To open the Ribbon Visual Designer, expand the ‘WordAddin_Project’ and then double click on the WordAddinPLM_Ribbon.vb file.
We can now ‘Drag and Drop’, Buttons and Menus into the ‘Group Box’, the first thing we will place into the Group Box will be a Menu.
Now the Menu item is placed, we can change the Label property to ‘PLM Lifecycle’.
Next we will expand the PLM Lifecycle menu, so we can drop Buttons and Menus into it, by Selecting the ‘Black Arrow’.
Repeat the process to add three Buttons and two Menu’s and rename them as shown below.
Then expand each of the menus adding the following buttons and again rename them.
Menu Images
Just to make it look a little prettier, I found a few images online for each of the menu items.
To add an image to a menu item, select one of the menu items and in the properties select Image…
If you don’t have any image Resources, select the Import… which will open a Explorer window, where you can select an image to add to the resources. Once you have an Image Resource, you can select the resource and pick Ok.
You can now do this for all the menu items.
Button Handler Name
The last step we want to do is a little house keeping, by selecting each button we can change the Design -> Name
Once this is completed for all Buttons, double click on each button this will add the Handler to the underlying code.
Imports Microsoft.Office.Tools.Ribbon Public Class WordAddinPLM_Ribbon Private Sub WordAddinrPLM_Ribbon_Load(ByVal sender As System.Object, ByVal e As RibbonUIEventArgs) Handles MyBase.Load End Sub Private Sub Btn_NewDocument_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_NewDocument.Click End Sub Private Sub Btn_SaveDocument_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_SaveDocument.Click End Sub Private Sub Btn_CloseDocument_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_CloseDocument.Click End Sub Private Sub Btn_CheckIn_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_CheckIn.Click End Sub Private Sub Btn_CheckOut_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_CheckOut.Click End Sub Private Sub Btn_Freeze_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_Freeze.Click End Sub Private Sub Btn_Release_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_Release.Click End Sub Private Sub Btn_Obsolete_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_Obsolete.Click End Sub Private Sub Btn_NewRevision_Click(sender As Object, e As RibbonControlEventArgs) Handles Btn_NewRevision.Click End Sub Private Sub WordAddinrPLM_Ribbon_Close(sender As Object, e As EventArgs) Handles Me.Close End Sub End Class
Testing
Now we have setup the Ribbon Add-On select the Start button to start debugging, this will start an instance of Word.
If Word does not start change the startup Project to the Word Add-in Project.
Once Word has started create a new Blank Document.
Change the active Ribbon tab to the Add-ins tab, we can now see our PLM Lifecycle Addin.
In a following Blog well start, to flesh out the rest of the project.