VSTO开发指南_TTC染色法的原理

VSTO开发指南_TTC染色法的原理1.VSTO是什么?我们可以用VSTO做什么?VSTO全称VisualStudioToolforOffice,是可以让我们针对现有的Office程序进行功能扩展。在工作或生活中其实我们或多或少用到过VSTO插件,例如安装有道词典/AdobePro会在Office程序中嵌入插件程序。2.VSTO开发环境的准备:(1).我们的PC上需要安装有Office(Office20...

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模块:

VSTO开发指南_TTC染色法的原理

3. Office 开发的模板

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

VSTO开发指南_TTC染色法的原理

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

VSTO开发指南_TTC染色法的原理

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

4. 核心对象

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

VSTO开发指南_TTC染色法的原理

初看起来,对象似乎重叠在一起。 例如, Document 和 Selection 对象都是 Application 对象的成员,但 Document 对象也是 Selection 对象的成员。 Document 和 Selection 对象都包含 Bookmark 和 Range 对象。 因为有多种方法可以访问相同类型的对象,所以存在重叠。 例如,你将格式设置应用于 Range 对象;但你可能想要访问当前选定内容、某一特定段落,某一节或整个文档的范围。如Selection中包含Bookmarks返回一个 Bookmarks 集合,该集合代表所选内容中的所有书签。Selection中的Document返回 Document 与指定的所选内容相关联的对象。Selection中的Range返回一个 Range object 类型的对象,该对象代表指定对象中包含的文档部分。

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属性来获得当前活动的文档,代码为:

using Word = Microsoft.Office.Interop.Word; 
// 应用程序级项目中获得文档对象 
Word.Document doc= Globals.ThisAddIn.Application.ActiveDocument; 
// 文档级项目中获得文档对象 
Word.Application app = Globals.ThisDocument.Application; 
Word.Document doc = app.ActiveDocument; 
只听到从架构师办公室传来架构君的声音:
秀艳过施粉,多媚生轻笑。有谁来对上联或下联?

Bookmark(书签)

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

Bookmark 对象表示文档中的相邻区域,同时具有起始位置和结束位置。 你可以使用书签标记文档中的某个位置,也可将其作为文档中文本的容器。 Bookmark 对象可以包含插入点,也可以与整个文档一样大。 Bookmark 具有下列特征,以将其与 Range 对象区别开来:

  • 你可以在设计时命名书签

  • Bookmark 对象随文档一起保存,因此在代码停止运行或文档关闭时不会被删除。

  • 通过将 ShowBookmarks 属性来访问 View 属性设置为 false 或 true

Range(范围)

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

Selection(选择)

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

内容控件对象

ContentControl 提供一种用于控制 Word 文档内文本和其他类型的内容的输入和呈现的方法。 ContentControl 可以显示多种不同类型的 UI,它们进行了优化以在 Word 文档中使用,如多信息文本控件、日期选取器或组合框。 你还可以使用 ContentControl 来防止用户编辑文档或模板的某些节

Visual Studio 会将 ContentControl 对象扩展到几个不同的主机控件。 虽然 ContentControl 对象能显示可用于内容控件的所有不同类型的 UI,Visual Studio 还是为每个内容控件提供了一个不同的类型。 例如,你可以使用 RichTextContentControl 来创建多信息文本控件,或者可以使用 DatePickerContentControl 来创建日期选取器。 这些主机控件的行为与本机 ContentControl的类似,但它们还具有其他事件和数据绑定功能。 有关详细信息,请参阅 内容控件

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

VSTO开发指南_TTC染色法的原理

更多内容,请参考:

Word object model overview - Visual Studio (Windows) | Microsoft Docs

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

此代码由Java架构师必看网-架构君整理
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:

VSTO开发指南_TTC染色法的原理

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

5. 如何部署VSTO插件

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

VSTO开发指南_TTC染色法的原理

需要注意的两个值:

LoadBehavior:3 代表了启动时自动加载。具体请参考: Registry entries for VSTO Add-ins - Visual Studio (Windows) | Microsoft Docs 中Load Behavior

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

VSTO开发指南_TTC染色法的原理

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

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

Browse code samples | Microsoft Docs

三、创建Word外接程序

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

  1. 创建完Word 2010外接程序之后,右键项目——>添加——>新建项,选择功能区(可视化设计器),在名称部分输入:“ExportPDFRibbon.cs“VSTO开发指南_TTC染色法的原理
  2.  点击工具箱,在Office功能区控件"中拖入Menu控件,然后在Menu控件中插入两个Button按钮,分别命名为"PDF"”XPS“
  3. 设计RibbonTab,因为上一专题中设计的Ribbon是一个独立的选项卡,所以在本项目中,我不想创建独立的Ribbon,想把Ribbon下的控件放在Home选项卡下,为了实现这个目的,必须把下图中的几个属性设置下,具体属性见下图: 

VSTO开发指南_TTC染色法的原理

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

public partial class ExportPDFRibbon 
    { 
        private void ExportPDFRibbon_Load(object sender, RibbonUIEventArgs e) 
        { 
            // 为PDf和XPS按钮注册点击时间 
            btnRibbonPDF.Click += new RibbonControlEventHandler(ExportDocument); 
            btnRibbonXPS.Click += new RibbonControlEventHandler(ExportDocument); 
        } 

        // 导出文件方法 
        private void ExportDocument(object sender, RibbonControlEventArgs e) 
        { 
           
            switch (e.Control.Id) 
            { 
                    // 判断点击的按钮ID 
                case "btnRibbonPDF": 
                    // 打开保存文件窗口 
                    using (SaveFileDialog saveFileDialog = new SaveFileDialog()) 
                    { 
                        // 设置保存文件窗口的相关属性 
                        saveFileDialog.Filter = "All File(*.*)|*.*"; 
                        saveFileDialog.DefaultExt = ".pdf"; 
                        saveFileDialog.RestoreDirectory = true; 
                        // 在保存文件窗口中点击保存按钮 
                        if (saveFileDialog.ShowDialog() == DialogResult.OK) 
                        { 
                            // 导出为PDF格式 
                            Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat( 
                                saveFileDialog.FileName, 
                                Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatPDF); 
                        } 
                    } 
                    break; 
                case "btnRibbonXPS": 
                    using (SaveFileDialog saveFileDialog2 = new SaveFileDialog()) 
                    { 
                        saveFileDialog2.Filter = "All File(*.*)|*.*"; 
                        saveFileDialog2.DefaultExt = ".xps"; 
                        saveFileDialog2.RestoreDirectory = true; 
                        if (saveFileDialog2.ShowDialog() == DialogResult.OK) 
                        { 
                            // 导出为XPS格式 
                            Globals.ThisAddIn.Application.ActiveDocument.ExportAsFixedFormat( 
                                saveFileDialog2.FileName, 
                                Microsoft.Office.Interop.Word.WdExportFormat.wdExportFormatXPS); 
                        } 
                    } 
                    break; 
                default: 
                    return; 
            } 
        } 
    } 

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

VSTO开发指南_TTC染色法的原理

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

VSTO的学习资源

Office and SharePoint development in Visual Studio - Visual Studio (Windows) | Microsoft Docs

Browse code samples | Microsoft Docs

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

Download Visual Studio 2010 Tools for Office Runtime from Official Microsoft Download Center

VSTO项目类型:

1、文档类型

如Word Document、Excel Workbook

2、AddIn类型

如Word AddIn、Excel AddIn

3、Shared AddIn类型

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

4、Excel自定义公式类型

架构君码字不易,如需转载,请注明出处:https://javajgs.com/archives/209646
0

发表评论