VSTO的特征
VSTO提供了一种编程模型,扩展了Word和Excel中的一些普通对象,例如书签或单元格区域。现在,这些对象有了数据绑定功能。例如,可以绑定数据库中的一个字段到Excel的单元格中。使用数据绑定,可以自动地使用数据填充文档的区域并在用户输入时更新数据库中的数据。
VSTO编程模型后面的原理是从数据描述中分离数据。现在可以直接访问驻留在数据源中的数据,而不必查找在文档中显示数据的该对象。数据源可以包括数据库、一个可扩展标识语言(XML)文件、或者甚至是一个文本文件。
数据绑定为服务器端编程是特别有用的。VSTO能够使您在文档中存储可从外部应用程序中访问的数据(不需要打开该文档)。通过在XML数据岛或数据缓存中存储数据来处理这样的操作。如果在数据缓存中存储数据,然后可以访问在服务器中的数据缓存,而不必在服务器中打开文档或者安装Word或Excel。
另一种VSTO对象扩展的方式是,它们添加在对象本身中不可用的事件。例如,现在可以根据工作表单元格的变化事件来编程,而不必遍历对象模型,编写多行代码来解决变化的单元格。当添加这些扩展的模型到文档或工作表中时,VSTO创建它们作为第一个类.NET对象,可以直接编程。这些对象被称作为宿主控件,添加宿主控件的文档或工作表被称作为宿主项目。
使用VSTO 2005 SE,可以为Office 2003和2007 Microsoft Office System创建应用程序级的加载项,VSTO 2005 SE也能够使您定制Office 2007的新UI,包括功能区、自定义任务窗格和Outlook窗体区域。
宿主项目和宿主控件
正如先前所提及的,宿主项目是一个类,代表到Office对象模型里的输入点。在Excel中当创建Excel解决方案时默认创建了四个宿主项目:Workbook,Sheet1,Sheet2和Sheet3。如果在设计时添加更多的工作表,则创建的新工作表作为宿主项目。通过使数据绑定和提供额外的事件,宿主项目扩展了原始的Office文档。
考虑宿主项目的一种方式是,它是Word或Excel的设计面,担当控件的容器。同样地,在VBA中添加控件到用户窗体中,可以添加Windows Forms控件,与宿主控件到宿主项目中一样。例外的规则是工作簿宿主项目,工作簿可以包含组件,但不是控件。
在Word中,当在VSTO中创建Word解决方案时,仅仅一个宿主项目─—文档─—被自动创建。在Excel中,每一个工作表、图表工作表和工作簿被考虑一个宿主项目。如果在设计时添加更多的工作表,VSTO在项目中创建它们作为宿主项目。
如果在运行时自动添加,则VSTO不会自动创建工作表作为宿主项目。这意味着如果编程添加一个工作表到工作簿中,则该工作表被创建作为原始的Excel工作表而不是宿主项目。因为该工作表不是一个宿主项目,不能获取该工作表的扩展功能,并且不可以编程在其中添加控件,正如在设计时创建工作表时可以做的一样。控件仅仅可以被添加到宿主项目工作表。
VSTO提供了所有控件的Controls集合(宿主控件及Windows Forms控件),您可以将它们添加到文档或工作表中。无论何时添加控件到文档中,它都被添加到文档的Controls集合。在Excel中,每个工作表都包含其自已的Controls集合实例。可以在设计时或运行时创建宿主控件。VSTO提供了许多更有帮助的方法,可以使用这些方法来动态添加宿主控件到文档中。
在Word对象模型中,VSTO扩展了三个对象到宿主控件中:Bookmark,XMLNode和XMLNodes控件。除了能够使数据绑定和为这些控件的事件外,VSTO改善了一些对象的功能。例如,赋给文本到某VSTO书签不会导致该书签被删除(当文本被赋给原来的Word书签时)。扩展的Excel对象包括NamedRange,ListObject,XMLMappedRange和Chart。
可以使用Word或Excel的原始功能添加宿主控件到文档中。例如,如果设计时在Word中从“插入”菜单选择书签,则它被添加为一个宿主控件。这些控件中的某些控件可以从工具箱中被拖动到文档中。工具箱包含可以添加到设计面中的所有控件,与VBE中的工具箱的概念相似。
当Excel工作簿设计器获取焦点时,在Excel控件选项卡中的工具箱里会出现NamedRange和ListObject控件。当Word文档获取焦点时,在Word控件选项卡里的工具箱中的书签控件是可用的。下图显示Word和Excel的工具箱中的宿主控件。

图:Visual Studio工具箱中Excel的宿主控件

图:Visual Studio工具箱中的Word宿主控件
为Word和Excel中存在另外的宿主控件,但这些宿主控件在工具箱中是不可用的。这些控件包括Excel的Chart和XMLMappedRange控件,以及Word的XMLNode和XMLNodes控件。
除了数据绑定外,为扩展的Office对象提供的主要功能是事件。许多Office对象模型对象本身不会公开事件。例如,在VBA中确定是否已修改单元格值的唯一方式是首先检查整个工作表的Change事件,然后确定在该工作表中特定的单元格里是否发生了变化。使用VSTO,可以直接在NamedRange控件的Change事件句柄中编写代码。在Word中,现在可以在Bookmark的BeforeRightClick事件句柄里编写代码。例如,可以创建当右击书签里的文本时显示的上下文菜单。
Windows Forms控件
Word和Excel有许多可以直接添加到文档中的控件,然后根据编写的VBA代码来响应该控件的事件。这些控件在文档中不总是稳定的,并且对许多控件的可用都有限制。在VSTO中不支持这些控件的创建。相反,可以使用Windows Forms控件。
VSTO使得可以添加Windows Forms控件到文档或工作表中。这些控件有通常可以添加到Windows Form中的常规Windows Forms控件的所有属性和事件,但是在文档中控件的行为与Windows Form中控件的行为相比有一些差异。例如,不能够设置驻留在文档中控件的Tab键顺序,因为不能从文档中的一个控件按Tab键切换到另一个控件。
可以在设计时或运行时添加Windows Forms控件到文档中。在使用宿主控件时,添加Windows Forms控件到文档或工作表的Controls集合。Winows Forms控件不会直接地被嵌入到文档中。相反,它们被嵌入到一个ActiveX控件中,而该控件被嵌入到文档中。因此,不能以添加控件到Windows Form的相同方式编程添加控件到文档中。在VSTO中,必须使用更有帮助的方法来编程添加控件到文档中。恰好有一个通用的为添加控件的AddControl方法,来指定想要的控件。
因为技术上的限制,当创建解决方案时(在设计时),不可以添加一些控件到文档中。因此,VSTO仅添加Windows Forms控件的一个子集到工具箱中为Word和Excel文档使用。例如,为了在设计时组合相关的控件,不能够拖动GroupBox控件到文档中,因此GroupBox控件在工具箱中是不可用的。下图显示了在设计时可以添加到Word文档或Excel工作表中的所有支持的Windows Forms控件。

图:Excel中支持的Visual Studio工具箱中的Windows Forms控件

图:Word中支持的Visual Studio工具箱中的Windows Forms控件
除了在文档中支持宿主控件和Windows Forms控件外,VSTO有一些其它的功能。可以在文档或工作表中添加智能标记,在文档中添加缓存数据,定制任务窗格,创建可管理的加载项,编写更多安全的定制代码,定制Office 2007中的UI,以及在更健壮的开发环境中工作。
智能标记(Smart Tags)
在以前,为Word和Excel创建智能标记决不是一件容易的事。VSTO提供了一个SmartTag类,能够使您通过指定用来识别的术语在文档中添加智能标记,当这些术语被识别时,就会采取相应的操作。注意,智能标记被指定给文档而不是整个应用程序。因此,可以控制特定文档的智能标记数量。
自定义任务窗格
Microsoft Office 2003在任务窗格中提供了应用程序的一些UI元素,例如“样式”和“格式”任务窗格(Word)和“新建工作簿”任务窗格(Excel)。没有使用VBA来定制这种任务窗格的方式,但是可以使用Visual Basic 6或Visual Basic.NET或使用XML创建智能文档。这些定制任务窗格的方法是相当困难的。此外,必须实现ISmartDocument接口,并且需要许多行代码来完成只是添加单个控件到任务窗格中的操作。
VSTO能使您仅用很少的代码就能定制文档操作任务窗格。VSTO提供了一个ActionsPane对象,仅使用一行代码就能添加Windows Forms控件或自定义控件到Word或Excel任务窗格中。VSTO操作窗格建立在已存在的ISmartDocument技术上,但是VSTO考虑了所有为您实现的细节。例如,不需要创建并附加XML扩展包。
在Word和Excel中,操作窗格仅对文档级的定制有效。如果想在Office 2007中定制新的应用程序级的自定义任务窗格,必须添加控件到CustomTaskPane对象中。
在文档中缓存数据
VSTO提供了数据缓存,用来存储文档里数据集中的数据,称作为数据岛。可以在数据岛中缓存数据,以便在没有连接到网络中时仍然可以访问数据,并且在重新建立网络连接后可以更新数据源。
这项功能在服务器中存在目标文档时,也是有用的。在服务器中运行Word或Excel不是Microsoft支持的方案。相反,VSTO能够使您访问文档里的数据,而不必运行在服务器中的Word或Excel。
可管理的加载项
VSTO提供了Outlook加载项工程模板,使得可以为Outlook 2003创建可管理的加载项。VSTO 2005 SE能够为Office 2003和Office 2007创建加载项。使用VSTO创建的加载项更稳定,并且有更简单的事件模型为装载和卸载该加载项。取代了IDTExtensibility2接口创建的加载项中使用的5个事件,VSTO提供了两个:Startup和Shutdown事件。这也与Excel和Word文档级解决方案中提供的Startup和Shutdown事件句柄一致。
如果使用VSTO或VSTO 2005 SE创建一个加载项,则该加载项被装载到称作应用程序域的隔离的执行空间。然后,VSTO确保当加载项失去连接或关闭应用程序时,卸载该加载项。
安全和部署
因为是使用Visual Studio来定制Office应用程序,所以可以利用.NET框架的所有安全特征。最终用户可以改变他们的Office应用程序中的安全性设置,以便所有代码运行,或者以便总是提示他们是否允许运行代码。典型地,最终用户只是单击询问是否想信任代码的对话框中的“确定”按钮。
代替让最终用户作出这项决定,VSTO使用了.NET框架的代码安全访问功能(CAS)。CAS根据条件确定是否运行代码安全,例如该代码所在的位置,是否代码被签名,以及管理者已设置了许可。这些安全需求使得部署比发布VBA解决方案更复杂,因为必须设置对发布集的安全承认许可。
支持Ribbon
Ribbon是Office 2007中的一项新特征,代替了传统的菜单和工具栏。使用VSTO 2005 SE,可以定制Ribbon,添加选项卡、组和按钮、或者隐藏Ribbon中已存在的UI元素。
增强的开发环境
因为在Visual Studio中创建VSTO解决方案,所以可访问IDE中所有可用的高级工具,例如数据源窗口。
注:本文整理自《VSTO for Mere Mortals》─—A VBA Developer’s Guide to Microsoft Office Development Using Visual Studio 2005 Tools for Office,有删节。

发表评论