VSTO开发指南

1. VSTO是什么?我们可以用VSTO做什么?

VSTO全称Visual Studio Tool for Office,是可以让我们针对现有的Office程序进行功能扩展。在工作或生活中其实我们或多或少用到过VSTO插件,例如安装有道词典/Adobe Pro会在Office程序中嵌入插件程序。

2. VSTO开发环境的准备:

(1). 我们的PC上需要安装有Office(Office 2007及以上版本);

(2). 以Visual Studio 2015为例,在安装时需要勾选Office Development模块。如果初始安装没有安装也没关系,可以在控制面板中通过更改Visual Studio的方式进行安装。成功安装后,打开Visual Studio 2015-->新建工程-->选择Office Development模块:

3. Office 开发的模板,我们主要看(Application-Level/Template-Level)的模板,这两者的加载方式请看下面的图示:

打开Office解决方案的文档后,Microsoft Office 应用程序检查自定义文档属性,以确定是否有与文档关联的托管代码扩展。

PS: 这两者在开发上的区别就是模板不一样,别的基本没有。另外一个Application-Level是针对整个Office Word/Excel/...的定制,而Template-Level是针对Word/Excel/...模板的定制。

4. 我们以VSTO Word Addin为例,讲一下VSTO Word Addin Development中的核心对象。

Application对象:代表Word应用程序,我们打开Word文档就是开启了一个Word应用程序,这里需要注意的是——无论你打开几个Word文档,都是在一个Word进程里进行管理的。它是所有对象的父级(从图中也可以看出,每个对象都是它的子节点)。

在应用程序外接程序项目中,我们可以通过下面的方式来获得Application对象: Globals.ThisAddIn.Application

在文档级别项目中,我们可以通过ThisDocument类的Application属性来获得Application对象,即代码为: Word.Application app = Globals.ThisDocument.Application;

Document对象代表着一个Word文档,即使你打开的是一个空文档,也是有一个Document对象,在我们对Word文档的内内容进行编辑,修改,删除,添加操作之前,我们都需要提前获得该对象,获得焦点的文档我们称为活动文档,我们可以通过Application对象的ActiveDocument属性来获得当前活动的文档,代码为:

  1. using Word = Microsoft.Office.Interop.Word; 
  2. // 应用程序级项目中获得文档对象 
  3. Word.Document doc= Globals.ThisAddIn.Application.ActiveDocument; 
  4. // 文档级项目中获得文档对象 
  5. Word.Application app = Globals.ThisDocument.Application; 
  6. Word.Document doc = app.ActiveDocument; 

Bookmark(书签) : 即书签,在现实生活中,我们使用书签是用来做标记的。同样Word文档中也有书签这个功能,我们可以对Word做一个标记,让你可以知道上次阅读到哪里了,Bookmark就是这样的一个对象。书签可以隐藏也可以变得可见,我们可以通过 View对象的ShowBookmarks属性设置为truefalse。代表了在Word文档中一个连续的区域,它有一个起始位置和结束位置,可以用一个标识来标记这段连续的区域,这个就是Bookmark

Range(范围) : 代表一个连续的区域,由一个开始字符位置和一个结束字符位置来确定。我们在文档中定义多个Range对象,看到Range对象,朋友们就会联想到Selection对象,他们都是代表区域,到底他们有什么区别呢?对于他们的区别——Range对象在文档中是不可见的,并且是连续的,而Selection对象是在文档中可见的,且可以包含多个不连续的文本块。通俗的说就是,例如,我们想对某些文本改变字体大小的操作,此时我们可以有两种方式来实现:第一种,就是使用Selection对象来选中该文本再改变其样式(此时选中的文本我们可以在Word文档中可以看见,我们可以清楚的明白那些文本需要改变字体),第二种就是使用Range对象来指定一个开始字符(就是一个文字)位置和一个结束字符的位置,这样在开始字符和结束字符之间就是一个Range对象,然后对该Range对象来设置它的字体样式,但是这整个过程中我们是看不到那些文本被选中了,所以在应用样式之前,我们是不知道那些文本会改变字体的,而是用Selection对象却不同,即使在应用字体样式之前,我们可以肉眼看出那些文本将会改变字体的。

Selection(选择) : 代表当前选择的区域。我们在对Word中内容进行某些操作的时候,例如,改变文本字体大小,此时我们就需要选中该文本,然后设置选中文本的字体大小,这样选择的文本就代表一个Selection对象,这里需要注意的是——Selection对象是一直存在于文档中的,因为有些朋友会问,如果我们没有选中任何文本时,是否还有Selection对象呢?答案是肯定的,当我们没有选择任何文本时,插入点(即操作文本时都会有一个这个符号“|”,该符号就是代表一个插入点)即是一个Selection对象,并且所选的内容可以包含多个不连续的文本块。

 

为了帮助更进一步理解这些对象,下面通过一张图来表示各个对象在一个Word文档中的对应关系:

更多内容,请参考:

https://msdn.microsoft.com/en-us/library/kw65a0we(v=vs.90).aspx

我们通过新建一个Word Addin的工程来初步认识下这几个对象。

Code:

        private void ThisAddIn_Startup(object sender, System.EventArgs e)

        {

            Application.WindowSelectionChange += Application_WindowSelectionChange;

            Word.Document doc = Globals.ThisAddIn.Application.Documents.Open(@"D:\demo.docx", AddToRecentFiles: false);

        }

        /// <summary>

        /// WindowsSelectionChange事件

        /// </summary>

        /// <param name="Sel">选中文本</param>

        private void Application_WindowSelectionChange(Word.Selection Sel)

        {

            if (Sel.Range.End - Sel.Range.Start > 10)

            {

                Word.Range range = Sel.Range;

                System.Diagnostics.Debug.WriteLine("Range Start Position: {0}  Range End Position: {1}", range.Start, range.End);

                range.Bookmarks.Add("MyBookmark");

            }

        }

运行效果: 向Word的Bookmark中插入一个Bookmark:

当我们编译Word Addin工程时,会向注册表中写入插件的一些信息,例如Description, FriendlyName, LoadBehavior, Mantifest等,此时当我们单独打开Word时,插件还是会运行的。清理一下Visual Studio Word Addin工程即可。

5. 如何部署VSTO插件(以Word为例),从Visual Studio编译Word插件时,向注册表中写入的信息,我们可以利用这些注册表信息来部署Word插件,

需要注意的两个值:

LoadBehavior:3 代表了启动时自动加载。具体请参考: https://msdn.microsoft.com/en-us/library/bb386106.aspx 中Load Behavior

Manifest:指定VSTO插件的具体位置:

PS: 也可以将插件的信息写入到注册表Machine节点下:HKEY_LOCAL_MACHINE--->SOFTWARE---->Microsoft--->Office---->Word--->Addins. 这样登录这台PC的所有用户都可以使用到这个插件。

在部署时,我们只需要将这些注册表信息写入正确的位置即可。当然最简单的部署方式可以通过ClickOnce来进行部署。另外也可以选择其他部署方式,例如Windows Installer: 可以参考:

https://code.msdn.microsoft.com/office/VSTO-Deploy-an-Office-fbcc09ad

 

三、创建Word外接程序

  上面已经介绍了Word对象中主要几个对象,在我们对Word文档进行操作的时候都是使用这些主要的对象来进行操作的,对于如何更好的掌握这些对象的使用?方法就是多写程序来练习了。下面就实现一个常见的需求的——Word文档转换为PDfxps文件。这里对于如何创建外接项目的过程就不介绍,具体的操作步骤和创建Excel解决方案是一样,只是选择的模板不一样,Excel中选择的是Excel 2010 外接程序模板,Word就自然选择的是Word 2010外接程序模板了。下面具体介绍实现该需求的过程:

  1. 创建完Word 2010外接程序之后,右键项目——>添加——>新建项,选择功能区(可视化设计器),在名称部分输入:“ExportPDFRibbon.cs“;

  2.  点击工具箱,在”Office功能区控件"中拖入Menu控件,然后在Menu控件中插入两个Button按钮,分别命名为"PDF"和”XPS“
  3. 设计RibbonTab,因为上一专题中设计的Ribbon是一个独立的选项卡,所以在本项目中,我不想创建独立的Ribbon,想把Ribbon下的控件放在Home选项卡下,为了实现这个目的,必须把下图中的几个属性设置下,具体属性见下图: 

  4. 在ExportPDFRibbon.cs文件的后台代码(可以按F7来查看后天代码)中插入下面的实现代码:

 

  1. public partial class ExportPDFRibbon 
  2.     { 
  3.         private void ExportPDFRibbon_Load(object sender, RibbonUIEventArgs e) 
  4.         { 
  5.             // 为PDf和XPS按钮注册点击时间 
  6.             btnRibbonPDF.Click += new RibbonControlEventHandler(ExportDocument); 
  7.             btnRibbonXPS.Click += new RibbonControlEventHandler(ExportDocument); 
  8.         } 
  9.         // 导出文件方法 
  10.         private void ExportDocument(object sender, RibbonControlEventArgs e) 
  11.         { 
  12.             switch (e.Control.Id) 
  13.             { 
  14.                     // 判断点击的按钮ID 
  15.                 case "btnRibbonPDF": 
  16.                     // 打开保存文件窗口 
  17.                     using (SaveFileDialog saveFileDialog = new SaveFileDialog()) 
  18.                     { 
  19.                         // 设置保存文件窗口的相关属性 
  20.                         saveFileDialog.Filter = "All File(*.*)|*.*"; 
  21.                         saveFileDialog.DefaultExt = ".pdf"; 
  22.                         saveFileDialog.RestoreDirectory = true; 
  23.                         // 在保存文件窗口中点击保存按钮 
  24.                         if (saveFileDialog.ShowDialog() == DialogResult.OK) 
  25.                         { 
  26.                             // 导出为PDF格式 
  27.                             Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat( 
  28.                                 saveFileDialog.FileName, 
  29.                                 Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF); 
  30.                         } 
  31.                     } 
  32.                     break; 
  33.                 case "btnRibbonXPS": 
  34.                     using (SaveFileDialog saveFileDialog2 = new SaveFileDialog()) 
  35.                     { 
  36.                         saveFileDialog2.Filter = "All File(*.*)|*.*"; 
  37.                         saveFileDialog2.DefaultExt = ".xps"; 
  38.                         saveFileDialog2.RestoreDirectory = true; 
  39.                         if (saveFileDialog2.ShowDialog() == DialogResult.OK) 
  40.                         { 
  41.                             // 导出为XPS格式 
  42.                             Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat( 
  43.                                 saveFileDialog2.FileName, 
  44.                                 Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatXPS); 
  45.                         } 
  46.                     } 
  47.                     break; 
  48.                 default: 
  49.                     return; 
  50.             } 
  51.         } 
  52.     } 

通过上面的步骤就可以完成开始提出的需求:把Word文档保存为PDF或XPS文件,具体运行结果为:

点击PDF按钮之后,会弹出另存为窗口,在弹出的窗口中输入你想保存的名称,点击保存按钮之后,此时你可以在保存的位置中看到保存的文件名。

VSTO的学习资源

https://msdn.microsoft.com/en-us/library/d2tx7z6d(v=vs.90).aspx

https://code.msdn.microsoft.com/office/

VSTO下载地址

VSTO 3.0 Runtime 

https://www.microsoft.com/en-us/download/details.aspx?id=23656

VSTO 3.0 Runtime SP1

https://www.microsoft.com/en-us/download/details.aspx?id=1132

VSTO 2010 Runtime

https://www.microsoft.com/en-us/download/details.aspx?id=56961

VSTO项目类型:

1、文档类型

如Word Document、Excel Workbook

2、AddIn类型

如Word AddIn、Excel AddIn

3、Shared AddIn类型

所谓Shared AddIn,就是该插件可以被多种Office文档共用,但是一般都是针对一种Office文档开发。

4、Excel自定义公式类型

(0)

相关推荐