




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
初识 VSTO Addin 开发 这篇博客将简单介绍一些 VSTO Addin 开发的知识 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 程序 Document 代表了一个 Word 文档 一个 Word Application 可以有 1 个或者多个 Document Bookmark 代表了在 Word 文档中一个连续的区域 它有一个起始位置和结束位置 可 以用一个标识来标记这段连续的区域 这个就是 Bookmark Range 代表了在 Word 文档中一个连续的区域 它有一个起始位置和结束位置 Selection 代表了当前选中的区域 更多内容 请参考 我们通过新建一个 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 do cx AddToRecentFiles false WindowsSelectionChange 事件 选中文本 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 代表了启动时自动加载 具体请参考 中 Load Behavior Manifest 指定 VSTO 插件的具体位置 PS 也可以将插件的信息写入到注册表 Machine 节点下 HKEY LOCAL MACHINE SOFTWARE Microsoft Office Word Addins 这样登录这台 PC 的 所有用户都可以使用到这个插件 在部署时 我们只需要将这些注册表信息写入正确的位置即可 当然最简单的部署方式可 以通过 ClickOnce 来进行部署 另外也可以选择其他部署方式 例如 Windows Installer 可以参考 VSTO 的学习资源 感谢您的阅读 我的 VSTO 之路 序 VSTO 是微软提供给 Net 开发人员的一个接口 通过他我们可以对 Office 程序做一些处理 但是这个接口并不尽善尽美 相比微软的很多其他产品 VSTO 的稳定性并不好 相关的文档 也很少 这种情况下 很多问题需要我们程序员自己去克服 我自己从 08 年进了现在这家公 司 断断续续做 VSTO 开发已经快 2 年半了 不敢说对 VSTO 精通 但至少已经有了深入的 解 尤其对开发中的一些 Trick 和一些 Bug 准备写点东西记录一下这两年来的心路历程 同 时也感慨于国内的 VSTO 文档资料实在匮乏 我自己在开发过程中走了不少弯路 希望我写的 这些文档能对后来的开发者们有所帮助 我喜欢在写文档之前先准备一个提纲 然后再往里面填充 所以在序里面 我先列一下我准备 写的主要内容 1 VSTO 基本知识 1 创建项目 2 添加 Ribbon 3 添加 Task Panel 2 Word 基本知识 1 Word Object Model 介绍 Application Document Range Selection 和 Bookmark 1 Application 对象 2 Document 对象 3 Range 对象 4 Selection 对象 5 Bookmark 对象 2 插件 自定义 Search 面板 3 Word 深入开发 1 修改右键菜单 2 往文档中插入内容 3 添加超链接 书签 4 基于选中内容 显示悬浮框 5 遗留问题 4 Outlook 相关知识 1 Outlook 的基本结构 2 获得 Outlook 的目录树 3 捕获新邮件和邮件移动 4 修改 Outlook 右键菜单 5 通过 VSTO 新建邮件或联系人 6 Outlook Form Region 的使用 以及扩展 Outlook 联系人的内容 7 遗留问题 5 Excel 相关知识 1 修改 Excel 中 Cell 的内容和样式 2 获得 Excel 中所有内容 即有输入的 Cell 3 修改 Excel 右键菜单 4 遗留问题 6 Smart Tag 1 VSTO Smart Tag 的开发 2 COM Smart Tag 的开发 7 发布 VSTO 程序 1 Click once 方式 2 安装包方式 8 VSTO 之外 1 对于 C 中对于 Excel 数据的导入与导出 这些文档除了 Smar Tag 是针对 Office 2007 的之外 其他的内容基本适用于 Office 2007 Office 2010 另外 抗议一下微软 居然在 Office 2010 中废除了 Smart Tag 大部 分的功能 我的 VSTO 之路 二 VSTO 程序基本知识 开始之前 首先我介绍一下我的开发环境 VS2010 Office 2010 是基于 Net framework 4 0 和 VSTO 4 0 以下的范例代码都基于这个 如果你使用的是 VS2008 那 么问题也不大 基本可以移植过去 需要注意的是 Net framework 4 0 中增加了 dynamic 类型类型和可选参数可选参数 而这两点新的特性在 VSTO 4 0 中被广泛使用 新特性的详细内容我就不介 绍了 其实介绍的地方很多 Google 一下就可以了 移植的时候需要稍微调整一下代 码 创建创建 VSTO 项目项目 环境搭建环境搭建 要开发 VSTO 项目 环境搭建比较简单 微软这方面做得都做不错 只要安装了 VS2010 需 要勾选 VSTO 4 0 和 Office2010 即可 VS2008 配合 Office2007 也可以轻松搭建开发环境 创建项目创建项目 选择创建新项目 C Office 然后选择 Word 2010 Add in 如下图 可以看到图中除了 Word 2010 Add in 还有 Word 2010 Document 和 Word 2010 Template 这两种项目类型 它们的区别在于 Add in 属于 Application level 即是一个插 件 每次 Word 启动的时候都会加载这个插件 而 Document 和 Template 属于 Document Level 这种项目会生成一个 Word 文件 Document 项目会生成 docx 文件 而 Template 会生成 dotx 你写的代码只有在运行这个特定的 Word 文件的时候才会起作用 添加自定义的添加自定义的 Ribbon 右击项目 添加新的 Item Office Ribbon Visual Designer 如下图 往 Ribbon 上 添加一个按钮 并取名为 Hello 双击 Hello 按钮 在 OnClick 中 添加如下代码 1 private void btHello Click object sender RibbonControlEventArgs e 2 3 System Windows Forms MessageBox Show Hello World 4 按 F5 运行当前程序 VS 会帮你自动开始一个新的 Word 实例 然后在 Word 中选择 Add ins 标签页 点击 Hello 按钮 如果你顺利看到 Hello Word 对话框 就说明你的第一个 VSTO 程序 顺利完成了 对于我们的一个 VSTO 程序 我们做一些小的优化 从前一张图我们可以看到 我们的 Ribbon 和其他插件的 Ribbon 都挤在了 Add ins 这个 Tabs 中 我们现在要把我们的 Ribbon 独立出来 在 VS 中 打开 Ribbon 的设计界面 并选择 Ribbon Tab 如下图 把 ControlIdType 改为 Custom 然后把 ControlID 改为 MyFirstAddin 这样我们的 Ribbon 会独占一个 Ribbon Tab 这里有个小 Trick 如果你的客户希望你把自己建的 Ribbon 插入到 Office 自己的 Ribbon 里面去 我们也可以实现 把 ControlIdType 设定为 Office 并把 OfficeID 设定为 TabHome 如下图 运行界面 其他的 OfficeID 可以到这里查看 Office 2010 IDs Office 2007 IDs 添加添加 Task Pane 创建创建 Task Pane Task Pane 是一个很有用的控件 它可以驻留在 Office 程序的窗口上 让开发者更具自己的 需求创建界面 首先我们先创建一个 User Control 之后这个 User Control 将嵌入在 Task Pane 中 而我们所添加的代码 主要也加在这个 User Control 中 在 UserControl 上放一个 Label 我们暂时不在这里写进一步的代码 在 ThisAddIn cs 文件中 进行如下修改 这样在这样 Addin 被加载时 就会显示 Task Pane 1 public partial class ThisAddIn 2 3 public CustomTaskPane MyCustomTaskPane null 4 5 private void ThisAddIn Startup object sender System EventArgs e 6 7 UCForTaskPane taskPane new UCForTaskPane 8 MyCustomTaskPane this CustomTaskPanes Add taskPane My Task Pane 9 MyCustomTaskPane Width 200 10 MyCustomTaskPane Visible true 11 12 13 private void ThisAddIn Shutdown object sender System EventArgs e 14 15 16 17 region VSTO generated code 18 内容被省略 19 endregion 20 运行结果 将将 Task Pane 与与 Ribbon 关联关联 我们已经完成了一个 Task Pane 接下去要用之前创建的 Ribbon 控制 Task Pane 的显示 先对之前的 Ribbon 做一些修改 增加两个按钮 同时我们对界面做一些美化 具体步骤我这 里不详述了 界面如下图 为 Open Task Pane 和 Close Task Pane 添加 Onclick 事件 代码如下 1 private void btnOpen Click object sender RibbonControlEventArgs e 2 3 if Globals ThisAddIn MyCustomTaskPane null 4 5 Globals ThisAddIn MyCustomTaskPane Visible true 6 7 8 9 private void btnClose Click object sender RibbonControlEventArgs e 10 11 if Globals ThisAddIn MyCustomTaskPane null 12 13 Globals ThisAddIn MyCustomTaskPane Visible false 14 15 运行你的程序 便可以看到结果了 本文总结本文总结 到这里 我介绍了 VSTO 的开发方法 以及 Ribbon 和 Task Pane 的基本知识 本文中的范 例程序可以在这里下载 MyFirstAddin zip 在之后的文章中 我会深入介绍 Word Excel 和 Outlook 的具体开发实例以及开发的细节 详细请看 我之前写的序 本文欢迎转载 但请保留出处 大家如果有问题 可以联系我 justin tyrael 我的 VSTO 之路 三 Word 基本知识 在前一篇文章中 我初步介绍了如何如何开发一个 VSTO 程序 在本文中 我将进一步深入介 绍 Word 的插件开发 Word 是一个大家在日常工作中一直接触的文档工具 也是微软最赚钱 的产品之一 从最初的 Word 1 0 到现在的 Word 2010 历经了 13 代的演化 已经成为了一 个比较复杂的系统 这里稍微跑题一下 Office 2010 的版本代号是 version 14 但是我 为什么说 Word 一共演化了 13 代呢 因为 Office 并没有 Version 13 上一代的 Office 2007 是 Version 12 微软觉得 13 这个死数字不吉利 所以直接跳过了 Oh my god 言归正传 我录制了一段视频来演示本文所要介绍的内容 这段视频 描述了一个简单的 Word 搜索插件 包含了以下几个功能点 1 自定义 Ribbon 2 自定义 Task Pane 3 VSTO 插件中获取 Word 内容全文 4 修改 Word 内容和样式 其中关于如何创建 Ribbon 和 Task Pane 的内容 我已经在前一篇文章中介绍了 如果你还 不熟悉 可以看这里 Word Object Model 介绍介绍 首先 要开发出良好的程序 我们需要了解我们的开发平台 而 Word 本身是一个很复查的平 台 我在这里先从 Word 的对象模型开始介绍 Word Object Model 中一共包含有数百个不 同类型的对象 其中最关键的也是最常用的是 Application Document Range Selection 和 Bookmark 他们的关系如下图 我来依次介绍这几个对象 Application 对象对象 Application 代表 Word 程序 而一个 Word 程序内可以包含多个 Word 文档 用通俗的话来 说 无论你开几个 Word 文档 都是在一个 Word 进程里面管理 这我们以后会讲到的 Excel 不一样 同时 Application 又是所有 Word 对象根 你可以通过 Application 对象 获得其他 对象 在 Addin 开发过程中 我们可以通过以下方式来获得 Application 对象 Globals ThisAddIn Application Document 对象对象 Document 对象代表着一个 Word 文档 即便你刚打开你的 Word 是一个空的新文档 也会 有一个 Document 在开发过程中 以下这个属性从 Application 中获得当前的 Document 对象 Globals ThisAddIn Application ActiveDocument 此外 Application 对象也维护着一个集合 即 Application Documents 里面包含着现在所 有打开的 Word 文档 Range 对象对象 Range 是一个比较特殊的对象 我其实都不知道如何用中文翻译贴切地翻译这个单词 在你 日常使用 Word 的过程中 你甚至可能不会知道有这样一个对象存在 但如果你想通过程序方 式修改 Word 正文的内容 Range 是一个很关键的对象 用微软官方的表述 Range 代表着 文档中一片连续的区域 微软为它列出了一下几个特性 1 Range 的组成成分可以是单独的插入点 也可以是一个文本范围或整个文档 2 Range 包含非打印字符 例如空格 制表符和段落标记 3 Range 可以是当前所选内容所表示的区域 也可以表示当前所选内容之外的 区域 4 Range 与始终可见的所选内容不同 它在文档中是不可见的 5 Range 不随文档保存 仅存在于代码运行期间 我再为它加 2 条 1 Range 有明确的开始和结束 但不同的 Range 之间是可以有交集的 2 Range 的长度是在变化的 如果你往一个 Range 里面插入的一个单词 它的 长度会自动变长 获得 Range 对象的方式很多 我们可以通过 Document 对象的 Range ref object Start Type Missing ref object End Type Missing 方法 创建一个自定义的 Range 通过 Word 中文档相关的对象都有一个 Range 属性 比如 Paragraph Range Selection Range Selection 对象对象 Selection 代表着当前光标所选中的对象 我们在开发过程中这个对象会和 Application WindowSelectionChange 一起使用 1 2 Summary 3 Occurs when the selection changes in the active document window 4 event ApplicationEvents4 WindowSelectionChangeEventHandler WindowSelectionChange Delegate 接口 1 TypeLibType 16 2 ComVisible false 3 public delegate void ApplicationEvents4 WindowSelectionChangeEventHandler Selection Sel Bookmark 与与 Content Control Bookmark 即书签 在 Word 文档中做一个标记 方便查阅 开发过程中 我们可以基于 Range 来创建 Bookmark 如 1 将第一段文档标记为一个 BookMark 2 Word Range range Globals ThisAddIn Application ActiveDocument Paragraphs 0 Ran ge 3 range Bookmarks Add JustinTest 至此我们已经介绍完毕了 Word 中的主要 5 个对象 现在我们运用我们学到的东西 来实开头 视频中的那个插件 插件 自定义插件 自定义 Search 面板面板 我先定义一下我们要实现的功能点 获得 Word 文档的内容 取得与检索关键字相关的上下文 并显示在 ListView 中 当用户点中 ListView 中的项目时 高亮显示 Word 文档中对应的内容 以下是如何实现这几个功能的介绍 获得获得 Word 的全文的全文 要取得当前 Word 的全文 我们主要要解决两个问题 1 如何获得当前的 Document 对象 2 如何通过 Document 对象获得文档内容 对于第一个问题 因为搜索功能主要是写在 Task Pane 中的 UserControl 中 这一点在上一 篇文章中已经有过介绍 所以取得 Document 对象的主要方法 是通过 Application 对象 获得 ActiveDocument 的对象 即当前编辑的文档 Globals ThisAddIn Application ActiveDocument 对于第二个问题 我们有两个方法 首先 Document 对象有 Paragraphs 集合 这个集合 里面包含了每个段落的对象 而每个段落对象 都有 Range 属性 我们可以通过 Paragraph Range Text 来获得每个段落的正文 其次 Document 对象有一个 Range 方法 通过它我们可以把整个 Document 作为一个 Range Search 按钮代码按钮代码 1 private void btnSearch Click object sender EventArgs e 2 3 清楚文档中的高亮显示 4 ClearMark 5 6 lvSearchResult Items Clear 7 if string IsNullOrWhiteSpace tbSearchText Text 8 9 return 10 11 12 按段落检索 13 Word Document currentDocument Globals ThisAddIn Application ActiveDocument 14 if currentDocument Paragraphs null 20 if mc Count 0 21 22 foreach Match m in mc 23 24 try 25 26 int startIndex paragraph Range Start m Index 27 int endIndex paragraph Range Start m Index m Length 28 29 Word Range keywordRange currentDocument Range startIndex endIndex 30 31 获取上下文信息 32 获取前两个单词的位置 如果 有 33 startIndex GetStartPositionForView paragraph m startIndex 34 35 获取后两个单词的位置 如果 有 36 endIndex GetEndPositionForView paragraph m endIndex 37 38 在 ListView 中展示检索的关 键字以及其上下文 39 Word Range range currentDocument Range startIndex endIndex 40 ListViewItem item new ListViewItem range Text 41 item Tag keywordRange 42 lvSearchResult Items Add item 43 44 catch Exception ex 45 46 MessageBox Show ex Message 47 48 49 50 51 52 介绍一下这段代码的几个功能点 1 在 Search 功能开始时 先清除文档中的高亮显示 ClearMark 方法稍后会 介绍 2 分段落 依次查找关键字 3 获得关键字的上下文 并放入 ListView 中显示 需要注意的时候 我在 ListViewItem 的 tag 对象里面 存入了 Keyword 在文档中的 Range 为了 ListView 点击事件 ListView 点击事件点击事件 1 private void lvSearchResult ItemSelectionChanged object sender ListViewItemSelectionChangedEventArgs e 2 3 ClearMark 4 if lvSearchResult SelectedItems Count 0 5 6 Word Range range lvSearchResult SelectedItems 0 Tag as Word Range 7 8 为了可以恢复被修改的 Range 我先将该 Range 和原本的 Color 放入 Class 的成员 9 LastRange range 10 LastRangeBackColor range HighlightColorIndex 11 range HighlightColorIndex Word WdColorIndex wdYellow 12 13 总体来说这段代码很简单 我稍微介绍一下 Range 对象的使用 这里我修改了 HighlightColorIndex 属性 来修改文字的背景色 如果你修改字体相关的样式 可以通过 Range Font 属性 此外 我会在下一篇文中 介绍如何通过 Range 加超链接 书签或者 Content Control 其他方法其他方法 1 private void ClearMark 2 3 if LastRange null 4 5 LastRange HighlightColorIndex LastRangeBackColor 6 7 我在 Search 事件和 ListView 点击方法中都会先调用这个方法 它会使用在 lvSearchResult ItemSelectionChanged 中保存的 Range 和 Color 来恢复之前的样式 总结总结 本文中 我介绍了 Word 对象模型的基本内容和我写的一个 Word 插件 包含对 Application Document 和 Range 对象的操作 Word 程序包含的内容是很多的 本来想把 自己了解的 Word 知识一次写完 但写到这里发现已经写了很多了 怕大家会看得累 所 以先发出来 再下一篇文章 我会进一步深入介绍 Word 插件开发 下次内容预告 1 修改右键菜单 2 往文档中插入内容 3 添加超链接 书签 4 基于选中内容 显示悬浮框 最后 本文范例的代码可以在这里下载 此外 本文欢迎转载 但请保留出处 大家如果有问 题 可以联系我 justin tyrael 我的 VSTO 之路 四 深入介绍 Word 开发 在上一篇文章中 我介绍了 Word 的对象模型和一些基本开发技巧 为了更好的介绍 Word 插 件开发 我为本文制作了一个 Word 书签的增强版 具体功能是让用户在 Word 中选择一段文 本 为它添加书签并其标志为高亮 同时用户可以为这段书签写注释 以后当用户点击这个书 签时 我就会显示注释 以下是我录制的视频介绍 这个插件将包括以下几个技术点 1 添加右键菜单 添加右键菜单 控制右键菜单显示 WindowBeforeRightClick 事件 删除右键菜单 2 修改正文内容 样式 1 修改选定的内容 2 修改选定的样式 3 添加控件 1 添加书签 2 添加超链接 3 添加内容控件 Content Control 4 基于用户选中内容 执行程序 1 WindowSelectionChange 事件 2 根据当前光标的位置 显示悬浮框 以下是我对这些功能点的具体介绍 右键菜单右键菜单 添加右键菜单添加右键菜单 右键菜单是 Word 中相当常用的一个功能 我们在大部分的 VSTO 开发中也会通过修改这个菜 单来扩展 Word 的功能 最通常地添加右键菜单的方法如下 1 添加右键按钮 2 Office CommandBarButton addBtn Office CommandBarButton Application CommandBars Text Controls Add Office MsoControlType msoControlButton missing missing missing false 3 4 开始一个新 Group 即在我们添加的 Menu 前加一条分割线 5 addBtn BeginGroup true 6 7 为按钮设置 Tag 8 addBtn Tag BookMarkAddin 9 10 添加按钮上的文字 11 addBtn Caption Add Bookmark 12 13 将按钮初始设为不激活状态 14 addBtn Enabled false 显示的效果为 控制右键菜单显示控制右键菜单显示 在很多情况下 我们希望根据用户选择内容来控制右键菜单的显示 那么我们就需要用到 WindowBeforeRightClick 事件 以下是我在范例中写的代码 只有当用户选择两个以上字符 的时候 我才会把我刚才添加的右键菜单激活 请注意代码里面的一些注释 VSTO 与 Office 的 COM 交互时 并不是很稳定 有很多需要注意的地方 1 void Application WindowBeforeRightClick Word Selection Sel ref bool Cancel 2 3 根据之前添加的 Tag 来找到我们添加的右键菜单 4 注意 我这里没有通过全局变量来控制右键菜单 而是通 过 findcontrol 来取得按钮 因为这里的 VSTO 和 COM 对象处理有问题 使用 全局变量来控制右键按钮不稳定 5 Office CommandBarButton addBtn Office CommandBarButton Application CommandBars FindControl O ffice MsoControlType msoControlButton missing BookMarkAddin false 6 addBtn Enabled false 7 addBtn Click new Office CommandBarButtonEvents ClickEventHandler RightBtn Cli ck 8 9 if string IsNullOrWhiteSpace Sel Range Text 12 13 这里是另外一个注意点 每次 Click 事件都需要重新 绑定 你需要在之前先取消绑定 14 addBtn Click new Office CommandBarButtonEvents ClickEventHandler RightBtn Cli ck 15 16 删除右键菜单删除右键菜单 我建议在 Addin 启动和关闭时候 ThisAddIn Startup 与 ThisAddIn Shutdown 中 每 次都清除由我们添加的右键菜单 虽然按照微软的提示 如果在创建的时候把 Temporary 属 性设为 true 系统会在程序退出时自动帮你删除 但是根据我的经验 微软这个许诺没有兑现 1 private void RemoveRightBtns 2 3 Office CommandBarControls siteBtns Application CommandBars FindControls Office MsoControlType mso ControlButton missing BookMarkAddin false 4 这里我写了一个循环 目标是清理所有由我创建的右键按 钮 尤其是由于 Addin Crash 时所遗留的按钮 5 if siteBtns null 6 7 foreach Office CommandBarControl btn in siteBtns 8 9 btn Delete true 10 11 12 修改正文内容 样式修改正文内容 样式 修改选定的内容修改选定的内容 Word 文档内容的修改 主要是通过 Range 对象来实现的 比较容易 例如 你可以先通过 Application ActiveDocument Range object start object end 方法来获得一个你需要的 Range 然后通过 Range Text 来修改正文的内容 例如 1 Word Range range Application ActiveDocument Range 0 10 2 if range null 3 4 range Text Justin 5 这里需要指出的是 获得 Range 的方式很多 你也可以通过用户选择的 Selection 对象来获 得 Range 详细内容可以参考我在上一篇随笔中的 Word 对象模型部分对象模型部分 修改选定的样式修改选定的样式 修改样式也是通过 Range 对象来实现的 这里我就写两个范例 一个是修改字体 一个是修 改背景色 VSTO 中称为高亮色 大家可以在这里进一步扩展出去很多东西 1 设置字体 2 range Font Name 宋体 3 4 添加下划线 点 5 range Font Underline Word WdUnderline wdUnderlineDotted 6 7 将背景色设为黄 8 range HighlightColorIndex Word WdColorIndex wdYellow 添加控件添加控件 Word 在正文中提供了非常丰富的控件 例如书签 超链接 注释等 这些控件可以方便用户 编辑和阅读文档 所以也是我们开发人员需要注意的一个重点 添加书签 以及其他的控件 在 Word 中实现的方法很多 本质都是通过获得书签集合 或其他对象的集合 然后通过这 个集合的 Add 方法来添加数据 一般在添加的同时 我们会指定这个控件所对应的 Range 即这个空间所包含的范围 因为这种控件对象很多 我这里列举几个范例 添加书签添加书签 对 Word 中一段文字添加书签 我们需要先去的这段文字的 Range 然后通过以下方法来实 现 VSTOBookMark 是书签的名字 Word Bookmark mark Range Bookmarks Add VSTOBookMark Range 添加超链接添加超链接 添加超链接和添加书签类似 区别在于超链接需要指定 url 且没有名字 Word Hyperlink link range Hyperlinks Add range url 添加内容控件 添加内容控件 Content Control 内容控件是 Word 2007 开始引如的新功能 是一批独立的控件 用于增强用户体验 这里我 介绍如何如在 Word 文档中添加一个下拉框 这是一段 Ribbon 的代码 为了方便我讲解 我 全部贴出来 1 using System 2 using System Collections Generic 3 using System Linq 4 using System Text 5 using Microsoft Office Tools Ribbon 6 7 using Office Microsoft Office Core 8 using Word Microsoft Office Interop Word 9 using ToolsWord Microsoft Office Tools Word 10 11 namespace OfficeContentControlsDemo 12 13 public partial class Rb 14 15 private void Rb Load object sender RibbonUIEventArgs e 16 17 18 19 20 private void button1 Click object sender RibbonControlEventArgs e 21 22 Word Document currentDocument Globals ThisAddIn Application ActiveDocument 23 24 if currentDocument Paragraphs null 29 currentDocument Paragraphs 1 Range Select 30 31 将 Interop 的 Document 对象转化为 VSTO 中的 Document 对象 32 ToolsWord Document document Globals Factory GetVstoObject currentDocument 33 34 添加 DropDownList 35 ToolsWord DropDownListContentControl dropdown document Controls AddDropDownListContentControl currentDocumen t Paragraphs 1 Range MyContentControl 36 dropdown PlaceholderText My DropdownList Test 37 dropdown DropDownListEntries Add Test01 01 1 38 dropdown DropDownListEntries Add Test02 02 2 39 dropdown DropDownListEntries Add Test03 03 3 40 41 42 43 运行效果 这段代码有两个特殊的地方需要注意的 1 首先 可能有人注意到了 我获得第一个段落对象时 使用的是 Paragraphs 1 而不是 Paragraphs 0 这是因为 VSTO 中的很多集合的 下标不是从 0 开始的 这可能是延续 VB 的风格 2 其实 我在这里把 Introp 的 Doucment 对象转化为了 VSTO 的 Document 对象 我们在前文中已经介绍了过了 Introp 的 Doucment 对象 它代表着 一个 Word 文档 即便你刚打开你的 Word 是一个空的新文档 也会有一个 Document 而 Microsoft Office Tools Word 下的 Document 它们大体 相同 区别在于 1 Controls 属性属性 使用此属性可在运行时在 Word 文档中添加托管 控件或者移除控件 2 VstoSmartTags 属性属性 使用此属性可在文档中添加 Smart Tag 2010 中 Smart Tag 基本被废了 3 InnerObject 属性属性 使用此属性获取 Microsoft Office Tools Word Document 的基础 Microsoft Office Interop Word Document 对象 4 文档级事件文档级事件 仅在 Word 对象模型的应用程序级别提供的文档级事 件 例如 BeforeClose 和 BeforeSave 也就是说 在 Word 对 象模型中 这些事件在 Microsoft Office Interop Word Application 对象上可用 而不 是 Microsoft Office Interop Word Document 对象 基于用户选中内容 执行程序基于用户选中内容 执行程序 在编程中 经常有客户向我提问 能否根据用户选择的内容显示相应的内容 这个功能看似复 杂 其实实现起来很简单 WindowSelectionChange 事件事件 WindowsSelectionChange 事件是这个功能的核心 每次当用户移动光标或者点击 Word 正 文内容时都会触发这个事件 事件参数为 Selection 即当前选中的位置 接下来 我们来看 一个实际的例子 根据当前光标的位置 显示悬浮框根据当前光标的位置 显示悬浮框 这是如何实现的代码 1 using System 2 using System Collections Generic 3 using System Linq 4 using System Text 5 using System Xml Linq 6 using System Windows Forms 7 using System Drawing 8 9 using Word Microsoft Office Interop Word 10 using Office Microsoft Office Core 11 using Microsoft Office Tools Word 12 13 namespace BookMarkAddin 14 15 public partial class ThisAddIn 16 17 public FloatingPanel FloatingPanel null 18 19 private void ThisAddIn Startup object sender System EventArgs e 20 21 this Application WindowSelectionChange new Word ApplicationEvents4 WindowSelectionChangeEventHandler Appl ication WindowSelectionChange 22 23 24 void Application WindowSelectionChange Wor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业自动化设备安装调试协议
- 互动效能评估体系-洞察及研究
- 轻质复合墙体应用-洞察及研究
- 家政服务化操作流程协议
- 风力发电应用-洞察及研究
- 品牌市场推广及合作协议条款
- 服装行业产品运输保护措施
- 工业零部件交货期承诺及保证措施
- 贝类养殖资源高效利用-洞察及研究
- 跨界艺术融合策略-第1篇-洞察及研究
- 幼儿园一日常规安全培训
- 5G基带芯片算法验证平台:从设计到实现的关键技术与实践
- 中邮理财招聘笔试题库2025
- 2024年西师版小学数学二年级上册教案全册
- 税务会计与税收筹划课件
- 城市照明设计案例赏析
- 2025年高考生物辽宁卷真题解读及复习备考指导(黑龙江吉林内蒙古适用)
- 新媒体视听节目制作
- 数字化教学环境下小学语文板书设计优化策略
- JG/T 237-2008混凝土试模
- JG/T 232-2008卫浴型散热器
评论
0/150
提交评论