关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
最近刚好有个用VSTO写Word插件的项目,顺便更新一些VSTO的文章。
作为第1篇VSTO的文章,讲一些新手刚接触VSTO会遇到的问题。(表示我一开始也遇到)
1、如何加入Ribbon菜单
2、Ribbon菜单独立1个菜单页
3、Ribbon菜单的按钮变大和加图标
4、Ribbon按钮名称文字换行
5、Office对象引用
6、获取Office对象
1、另外这里说的都是Office插件,即外接程序。不是文档和模版
2、建议使用的是C#作为VSTO的开发语言。VB.net用起来很别扭,四不像。
3、本文用Word为例,Excel和PPT基本相同操作方法。
4、新建VSTO项目的.NET版本我一般选用4.0。外接程序的版本一般选择2010(可以在Office2007\2010\2013\2016使用)
新建项目之后,资源管理窗口空空的。
一般刚开始接触VSTO会无从下手,不知道下一步该干嘛。
下一步,要创建Ribbon菜单,提供用户交互界面。
右键项目,添加-->新建项,插入可视化功能区。
注意编程习惯,给Ribbon命名。这样就可以插入一个Ribbon菜单,做为用户交互界面。
新建的Ribbon菜单默认有一个Tab控件和Group控件。顺便说明一下这些Ribbon控件的层次关系。
Ribbon --> Tab --> Group --> 其他Ribbon功能控件(例如Button、Menu、SplitButton等等)
别被吓到,看似复杂,其实只是不了解。了解它们的作用就不会觉得复杂
1)Ribbon:该Ribbon是最外层的可视化容器,可以简单理解为本插件。
2)Tab:Ribbon上的菜单页,就像Office自己的菜单“开始”、“插入”等等。可插入多个Tab。一般建议1个Tab。
3)Group:Tab菜单页中的分组,是一个其他功能控件放置的容器空间。
4)其他Ribbon功能控件:例如用户可以点击的按钮、下拉菜单等等。
细心的人可以发现默认的Tab有内置两个字。若不做其他修改,调试运行可发现该插件的菜单都在加载项中,非独立1个菜单页。
一开始我也是找了很久Tab控件的属性才找到设置的位置。
选择Tab,展开ControlId,把ControlType属性改成Custom即可。
另外,可以在label属性设置该菜单页的显示菜单名称。
默认插入进来的Button按钮是小按钮且无图标,如下:
可以设置Button按钮的ControlSize属性,将其改成大按钮
大按钮默认是要图标的,可以设置Image属性,导入现有的图片文件。
这里的图片文件,建议用32*32的png图片。可以在一些网站找到,例如EasyIcon。
为了规范,建议新建一个资源文件专门存放Ribbon菜单的图标。
新建资源文件之后,先不用往里面添加图片。直接在Button按钮的Image属性找到这个资源文件,导入图片即可。
为了统一管理,建议在VSTO的工程目录下创建一个文件夹专门用于存放Ribbon菜单的图标。每次导入都从该文件夹中选择。
当然,你也可以修改Button按钮的ShowImage属性和ShowLabel属性控制是否显示图标和名称。
这里我的Button按钮用4个字的名称还好,通常可以两个字在同行。有时排列不整齐,有时文字不是4个字,这些需要自己换行控制。
Button按钮的Label属性在属性面板没法输入换行符。需要打开Ribbon菜单的设计文件。
直接查找按钮的标题。如上图所示,找到这个按钮的Label属性设置。
C#的换行符是\n。在需要换行的地方加入\n即可。
要操作Office对象就需要先引用。建议如下方式引用:
using Word = Microsoft.Office.Interop.Word;
Excel和PPT VSTO项目也是如此:
using Excel = Microsoft.Office.Interop.Excel; using PPT = Microsoft.Office.Interop.PowerPoint;
欲操作Office对象,前面引用了,还想要获取。
Office对象模型基本差不多,最顶层是Application应用。
接下来是文档集合,Word是Documents,Excel是Workbooks。这些都是vba的知识。
在VSTO中,都是通过Globals全局对象中找到当前插件ThisAddin。在从ThisAddin获取当前的Application。获取到Application之后,就可以获取Office其他对象。以Word和Excel为例。(PPT的vba没用过,不知道怎么写。道理类似)
Word:
//Word引用 using Word = Microsoft.Office.Interop.Word; //某个类或方法中获取 Word.Application app = Globals.ThisAddIn.Application; Word.Documents docs = app.Documents; Word.Document doc; //判断是否有文档,获取正在使用的文档 if(docs.Count > 0){ doc = app.ActiveDocument; }
Excel:
//Excel引用 using Excel = Microsoft.Office.Interop.Excel; //某个类或方法中获取 Excel.Application app = Globals.ThisAddIn.Application; Excel.Workbooks works= app.Workbooks; Excel.Workbook work; Excel.Worksheet sheet; //判断是否有文档,获取正在使用的文档 if(works.Count > 0){ work = app.ActiveWorkbook; sheet = app.ActiveSheet; }
常见的问题先讲到这里,后面再更新一些其他和VSTO相关的东西。
相关专题: VSTO的那些坑