VSTO学习笔记(一)VSTO概述

接触VSTO纯属偶然,前段时间因为忙于一个项目,在客户端Excel中制作一个插件,从远程服务器端(SharePoint Excel Services)上下载Excel到本地打开,用户编辑后再上传回服务器端。当时工期紧迫,临时查了些资料,用VSTO + Excel COM API完成。正因为这个项目,我发现了VSTO的强大功能与潜力,决定抽出一些时间来好好研究下。

示例代码下载

本系列所有示例代码均在 Visual Studio 2010 Beta 2 + Office 2010 Beta 下测试通过 

 

一、什么是VSTO?

VSTO = Visual Studo Tools for Office,是.net平台下的Office开发技术。相对于传统的VBA(Visual Basic Application)开发,VSTO为中高级开发人员提供了更加强大的开发平台和语言,并部分解决了传统Office开发中的诸多问题(难于更新、可扩展性差、难以维护、安全性低等),开发人员可以使用熟悉的技术来构建更加灵活的、强大的、跨平台的企业级解决方案。

二、为什么要进行Office开发?

    Office拥有强大的数据分析、显示和计算能力,尤其在桌面领域,已经成为了办公自动化的行业标准。虽然Office功能强大,但是也不可能满足各行各业的特定需求,如果能够借助于Office构建企业的个性需求,那将十分具有吸引力。这样,在不需要其他专业软件的情况下,就可能完成既定的目标。

三、Office开发简史

1、VBA(Visual Basic Application)

    微软提出的第一种Office开发解决方案就是VBA,在20世纪九十年代VBA红极一时,借助于当时如日中天的Visual Basic,VBA取得了巨大的成功,无论是专业的开发人员,还是刚入门的非开发人员,都可以利用VBA完成简单或复杂的需求。但是VBA本身拥有很多的局限性,VB语言虽然简单,但是其语法令中高级开发人员不太适应,尤其是VBA的开发环境过于简单,缺少与时俱进的高级功能,使得VBA开发陷入了瓶颈。

2、VSTO 1.0(VSTO 2003)

时光跨入21世纪,微软发布了.net平台,并推出了新千年的新语言:C#,VBA一统Office开发天下的情况终于有所转变。从Office 2003开始,Office正式由一个桌面办公平台转化为了桌面开发平台,微软也适时推出了VSTO 2003,即VSTO 1.0。正是由此开始,Office开发跨入了一个新的时代,开发人员可以使用更加高级的语言和熟悉的技术来更容易的进行Office开发。VSTO 1.0完全编程支持Office 2000和Office XP,提供了以文档为中心的开发平台,开发人员使用.net framework 1.1开发Office中的一些自动化程序等。

3、VSTO 2.0(VSTO 2005 SE)

    VSTO 2.0随同Visual Studio 2005推出,提供了大量新特性:

  1. 提供了新的文档模板
  2. 对Word、Excel的可视化支持
  3. 可以使用托管的Windows Forms控件或组件
  4. 宿主控件(不知道翻译的怎样:))    
  5. 支持在文档中添加智能标签
  6. 动作面板支持
  7. 数据绑定、数据源、数据模型支持
  8. 数据缓存
  9. 服务器端编程
  10. 配置文件
  11. 新的部署方式
  12. InfoPath开始支持托管代码
  13. 与众不同的Outlook 托管插件

4、VSTO 3.0(VSTO 2008)

VSTO 3.0随同Visual Studio 2008发布:

对于Office解决方案开发来说,VSTO是简单但强大的框架。这个框架为每个Office开发者带来了许多令人惊叹的好处:窗体控件、类、安全性、服务器可测量性、面向对象特征、完整性、易发布,等等。
1)
、更安全的托管代码扩展
VSTO
允许托管和非托管代码无缝地放在一起到相同的.NET程序集里,这允许开发者保留非托管代码而无须完全重写。带有链接或引用托管代码程序集的文档或工作簿被作为托管代码扩展。通过使用VSTOWordExcel中创建托管代码扩展,与宏相似但更安全。使用VSTO,能够创建仅需要装载数据的模板。
2)
、数据缓存
数据缓存,简单地说,就是在内存中存储数据以便于快速访问。Microsoft Office Word文档或Excel工作簿有一个隐藏的控件,称之为运行时存储控件(Runtime Storage Control),存储缓存的数据。VSTO提供数据缓存功能,使用C#中的ServerDocument类,通过应用程序外部到Office来操控数据缓存,无须访问WordExcel对象模型。
3)
、自定义功能
使用可重复使用的类,VSTO 3.0提供极好的控制来自定义Office应用程序。不像VBA开发者,VSTO开发者不局限于VBA函数库。VSTO提供了相当广泛的类、对象和事件来创建Office商业解决方案。使用VSTO,开发者能够为Office应用程序自定义功能。这能够简单到在应用程序命令栏中添加按钮或自定义任务窗格,或者复杂到用于访问不同数据源的数据报表模板。
4)
、自定义用户界面
VSTO
提供Windows窗体控件,帮助你为Office解决方案开发富用户界面(UI)。通过使用大量各种各样的控件集,VSTO开发者能够为用户创建丰富的数据视图。每种和每类Windows窗体控件都有自已的属性、方法和事件设置,适合不同的需要。
通过在文档和任务窗格里使用控件,VSTO使创建丰富的用户界面更容易。例如,可以创建一个活泼的按钮命令产生套用信函。又如,假设公司在其服务器上存储了数据内容,用户在处理文档时想从服务器中引用一些内容并且不想离开当前编辑的文档,使用VSTO可以使服务器内容在文档的任务窗格中可用而无须干扰用户当前的工作。
5)
、智能标记
智能标记是Office应用程序能够在文档里识别的字符串。启用智能标记,Word试图识别文档中某类数据,通过紫色的点划线来显示。单击智能标记,出现特定数据类型的可能操作的列表。VSTOOffice开发者提供了对象模型,可用于为文档和工作簿创建智能标记。
6)
WPF支持
WPF
能用于创建丰富的、具有吸引力的外观。在VSTO环境中可使用WPFVSTO的可视设计器支持Windows窗体和WPF控件的使用。WPF为创建基于客户和基于网络的应用程序提供了可靠的编程模型,并且在商务逻辑和UI之间呈现清楚的分离。
7)
、可视化的设计器
VSTO
Office应用程序提供了可视化的设计器,例如Word 2007Excel 2007,显示在Visual Studio IDE里。在Visual Studio IDE里创建窗体只需拖动并放置窗体到Office文档中。开发者能够访问Visual Studio IDE中的许多工具和功能,例如智能感知、拖放控件和数据源。VSTO也提供了Ribbon可视化设计器,用于通过使用简单的.NET应用程序编程模型自定义Office功能区和编程。
8)
、安全改进
VSTO
安全模型包含从Office信任中心和Visual Studio Tools for Office运行时的广泛支持,帮助解决VBA代码通常涉及的安全问题。VBA安全模型有许多缺点,容易使用VBA开发许多病毒。为了安全地运行VBA宏,用户机器中必须设置安全性为高,并且使用数字签名。更重要的是,这些操作都需要用户手工执行。在VSTO 3.0中,已经修改了安全模型。VSTO创建了安全策略,每次创建工程时必需在计算机中运行和调试解决方案,在发布前签署程序集。
9)
、可维护性
Office系统开发的VSTO解决方案更容易维护。更新已发布的解决方案,修改代码,以及更新单个的程序集将帮助更多的资源在相同文档的多个副本里做相同的事情。所有代码将驻留在程序集里。在使用宏时,脚本驻留在Office文档里,无论何时想更新代码,必须修改每一个包含代码的文档。使用VSTO 3.0,能够通过简单地修改代码和更新单个的程序集来管理应用程序级加载项,无须在相同文档的多个副本中做同样的事情。


VSTO 3.0
的新功能
VSTO 3.0
具有大量的新功能,也增强了现有的关键功能。下面列出在VSTO 3.0中可用的改进Office解决方案开发工作的一些关键的新功能:

  • 文档级的定制:文档级的定制是自定义驻留在单个文档里的解决方案。使用VSTO的文档级定制是新版VSTO中添加的关键功能之一。VSTO支持WordExcelInfoPath的文档级解决方案。

     

  • 应用程序级加载项:应用程序级加载项被创建为托管代码程序集,当相关的Office应用程序启动时将装载应用程序级加载项。VSTO 3.0提供了直接编程访问.NET对象和控件。

 

  • 功能区可视化设计器:功能区是组织相关命令的新方式。实际上,它们作为控件显示。可视化设计器提供高级工具并支持更容易地创建和设计自定义功能区。

 

  • 任务窗格:任务窗格帮助用户快速且更方便地访问信息。取决于用户的喜好,可以在Office应用程序用户界面中显示或隐藏任务窗格。

  • 窗体区域:窗体区域是自定义标准的Outlook 2007用户界面的新方式。例如,在Visual Studio 2008中,VSTO 3.0提供了基于Windows窗体的设计和开发环境。这允许Office开发者在单个的开发环境中设计和编码新的Outlook窗体区域,将大多数Windows窗体引入到Outlook的宿主环境中。

     

  • 工作流支持:VSTO提供可视化设计器支持开发者使用Visual Studio 2008创建工作流。一个向导选项用于创建工作流,并且直接将其赋值到发布位置。

 

  • SharePoint支持:VSTO中的新对象帮助开发者在Office应用程序中为SharePoint编程。可以使用VSTO扩展Office客户端应用程序,使用SharePoint Portal将它们整合到企业解决方案中,例如客户关系管理、供应链管理以及其他类似的应用程序。

  • 使用ClickOnce部署:ClickOcne部署技术允许基于Windows应用程序使用最小程度的用户交互来部署和运行。安全区将限制使用ClickOnce技术部署的应用程序的许可和操作。

 

  • Word内容控件:内容控件是容器,其中能放置特定类型的内容,例如日期、列表、图片或文本。

  • 富用户界面控件:能够创建带有丰富且容易访问的用户界面的Office解决方案。例如,可以创建带有Windows控件的任务窗格,和其它数据源交互数据。

 

  • 支持其他的Office应用程序。

VSTO架构
VSTO
应用程序由Office应用程序和.NET程序集组成。

  • Office应用程序:VSTO公布了对象,使之更容易编写Office应用程序。包括扩充应用程序和处理应用程序使用的数据的对象。要理解的重点之一是WordExcel编辑器提供了WordExcel文档视图。使用这些编辑器,可以编辑和格式文档,就像直接在Office应用程序中操作一样。

  • .NET程序集:包含中间语言(IL)代码。描述程序的二进制信息的元数据存储在内存中,是.NET程序集的一部分。除了元数据信息外,程序集也有称作Manifest的专门的文件。Manifest包含程序集当前版本的信息。

VSTO架构的核心组件是文档级定制、应用程序级加载项和文档级的数据模型。VSTO的新架构允许编写和运行带有宏的Office应用程序。

上图表明Office 2007解决方案逻辑架构。VSTO能够使Office开发者为InfoPathWordExcel文档创建文档级定制,而对于OutlookPowerPointVisioVSTO不支持文档级定制。
VSTO
提供了非常好的面向对象编程支持。VSTO提供了对C#编程语言的完全支持,允许在Office解决方案中执行面向对象编程。面向对象编程是一种软件编程方式,程序结构基于对象之间的交互,以执行任务。
VSTO
的架构设计帮助Office开发者实现了应用程序和数据的分离,提供开发应用程序级解决方案的增强支持,并且公布了多种对象使Office开发者更容易编写Office应用程序。开发应用程序级和文档级的解决方案是VSTO中另一项架构改进。


开发方式
使用VSTO 3.0创建的解决方案类型分成两类:文档级解决方案和应用程序级解决方案。
1)
、面向文档的方式
面向文档的方式被专门设计为接触WordExcel文档的核心并包含原先设计的文档不支持的信息。VSTO 3.0支持面向文档的方式创建WordExcelInfoPath。实际上,面向文档的方式提供指向非常特定任务的文档,不会影响到文档驻留的应用程序。
2)
、面向应用程序的方式
VSTO 3.0
具有为Office 2007套件中所有的应用程序创建面向应用程序的方式的能力。可以创建和执行向Office应用程序中添加了各种功能和特征的加载项。
VSTO
开发和部署
VSTO
系统3.0运行时,运行Office 2007解决方案的首要需求,被内置到VSTO中。而VSTO 3.0被内置到Visual Studio 2008安装中。
使用VSTO创建Office应用程序
Visual Studio 2008中包括VSTO,也就是说,Microsoft首次将Visual Studio 2008VSTO 3.0绑在了一块。在VSTO 3.0中,Microsoft Office工具变得更加强大,因为Microsoft使Office开发环境对开发者更加友好,通过创建新的开发环境帮助开发者创建Office应用程序里的功能的解决方案。因此,Office开发者能够容易地创建解决方案,为他们的商务做更多工作,另一方面,重复使用Office应用程序中现有的可用功能,从而减少成本开支。
VSTO
甚至可以整合现有的ERP系统,增进企业的成长。可以使用VSTO扩展Office客户端应用程序,将VSTOSharePoint Portal整合来提供企业解决方案,例如Office商务应用程序,包括客户关系管理、供应链管理,等等。


1
VSTO开发环境
VSTO 3.0
不是单独的安装包,当安装Visual Studio 2008时,VSTO 3.0将与其它的框架和所需的组件一起安装。
2
、包(Package
当安装Microsoft VSTO 3.0分发包时安装VSTO运行时。VSTO 3.0分发包是将Visual Studio 2008.NET框架的功能和生产力带给建立在Office 2007应用程序中的商务解决方案的框架。

上图说明了VSTO的版本历史,以及各版本之间的一些主要的不同。当前版本的VSTO仅支持编程语言VB.NETC#。我们期望VSTO的下一个版本能支持其它的编程语言。


3
Visual Studio整合
为了容易创建定制的用户界面,VSTO 3.0Visual Studio里提供了Office应用程序的可视化表现。VSTO 3.0很好地与Visual Studio 2008整合在一起,为Office开发者提供了完整的开发和部署Office解决方案的工具。Visual Studio 2008能够使开发者创建可升级的Office商务应用程序、改变主要的Office UI特征、支持工作流、以及创建更容易的部署。
下面,看看Visual Studio 2008Office 2007应用程序的典型的VSTO项目模板。

Visual Studio 2008
已经打包了使用VSTO创建Office解决方案所需要的全部VSTO 3.0组件。当安装Visual Studio 2008时,所有相关的安装,包括VSTO 3.0的项目模板、Office开发引用和其它组件,都被安装并完全整合到新的Visual Studio 2008开发环境中。

 


4
、创建VSTO解决方案
在开发和传递创新的Microsoft技术方面,Visual Studio 2008是非常快速、协同性好和灵活的,包括增强的语言和数据功能。Office 2007中支持的C#VB.NET是增强的语言特性之一,并且容易与其它数据源交互数据,例如Microsoft SQL服务器,是数据特性之一。这些特性确保开发者能够快速地创建连接的应用程序,传递下一代软件实践,以及克服应用程序软件开发挑战。

上图表现了Office解决方案的开发环境。在图中,客户端代表开发环境机器,在Visual Studio 2008里面的VSTO 3.0代表VSTO整合在Visual Studio中,Office 2007客户端工具是Office应用程序,包括WordExcelInfoPath等,应该被安装在客户端机器上。
使用Visual Studio 2008开发环境能够创建应用程序级、数据中心解决方案。数据中心解决方案是集中于数据操作和数据存储的功能。
Visual Studio 2008
开发环境使得开发带有主要的Office 2007系统特征设计时和运行时支持的解决方案成为可能,例如功能区、自定义任务窗格、文档级解决方案、Outlook窗体区域,等等。
功能区是Office应用程序中表现菜单项的新方式。在新开发环境中,有可视化设计器,能够拖拉功能区里的控件,容易设计自定义的功能区菜单。甚至数据相关的操作,例如创建数据连接,有数据连接向导容易创建数据连接。
在创建的Office项目解决方案中,可以看到列出的引用,例如System.AddInSystem.Core等等,它们被自动装载作为项目模块的一部分。这使得开发者更容易开始编程,不需要像以前一样手工添加引用和验证解决方案。
通过使用基于XML的数据/视图分离和编程性,Office开发者能够将商务数据整合到文档里。


5
、查看IDE窗口
Visual Studio
是一款极其优秀的产品,专门为开发者设计,是开发者最常使用的开发工具之一,内置有IDE,能够使开发者使用Microsoft技术创建不同类型的应用程序。通常,IDE由源代码编辑器、编译器和调试器组成。默认情况下,Microsoft Visual Studio IDE提供智能感知、调试、编译、访问控件、以及创建解决方案的能力。最新增强了功能区设计器、拖放控件、并为Office应用程序增强了调试功能,缩减了开发时间,提高了开发者的效率。
内置的VSTO对象模型被设计来支持.NET,许多常用的功能被打包且很好地整合了。在新版本中,诸如WordExcelInfoPath的目标窗口工具被直接整合到IDE界面里,帮助Office开发者无须对象模型的高级知识就能创建解决方案。对于Word 2007Excel 2007VSTOVisual Studio IDE中也有可视化设计器。

上图中,可以看到Visual Studio 2008中如何显示Excel 2007可视化设计器。同样,Visual Studio 2008 IDE也提供了可视化功能区设计器,允许Office开发者使用拖放界面来设计功能区,使用标准的.NET代码与功能区交互。

上图显示Office解决方案开发里功能区的可视化设计器,通过提供拖放控件和容易访问资源,简化了功能区开发过程。同样,Visual Studio 2008简化并加速了操作窗格、指定文档的任务窗格、创建指定应用程序的自定义任务窗格以及Outlook窗体区域设计器的开发过程。


6
、调试
调试是软件开发中最重要的任务之一,并且是所有开发者在他们的开发过程中会遇到无数次的一项任务。在Visual Studio IDE中,开发者为调试.NET应用程序有几种可用的调试选择。
Visual Studio 2008
为使用VSTO 3.0Office解决方案开发提供了一组强大的创建和调试工具,与VSTO 2.0相比是一项大的改进。在创建配置时,开发者能够选择他们想创建的组件,排除他们当前想避免创建的组件。开发者可以像项目一样,灵活地为解决方案创建配置。

 


我们期望下一版本能带来什么?
基于笔者的分析和作为一名VSTO开发者的经验,我们期望下一版本的VSTO

  • 目前,VSTO 3.0支持VB.NETC#开发Office解决方案。在将来的VSTO版本中,我们期望支持其他语言,例如C++,这将帮助C++开发者创建VSTO解决方案。
  • VSTO 3.0智能标记仅限于Office应用程序中文档级解决方案,不能在应用程序级解决方案中使用,因此我们期望Microsoft在将来的VSTO版本中添加这项功能。
  • 使用VSTOVisual Studio环境在Office应用程序内创建工作流活动是我们在下一版本中期望的功能。数据和应用程序协同工作的能力是Windows工作流的核心,在VSTO中的改进将帮助我们重新组织面向工作流的开发。
  • 应该在将来的版本中在Visio应用程序中也添加使用VSTO创建文档级的自定义任务窗格的功能。这将对Visio用户管理自定义形状是有用的。

5、VSTO 4.0(VSTO 2010)

虽然现在VSTO 4.0还没有正式发布,但是从测试版已经可以看出些端倪:

  1. 64Office 2010开发的支持
  2. 折叠工具栏项目支持
  3. C# 4.0 .net framework 4.0支持
  4. 一次针对所有用户部署Office项目
  5. 在单个包中部署多个Office项目
  6. 部署完Office项目后仍可以执行附加操作

 

四、Office开发存在的问题

    由于历史遗留问题,Office本来是设计与COM协同工作的,这就使得从一开始VSTO就有点"水土不服"。.net代码通过封装COMOffice通信,但是有时这种配合却并不协调,Office对象模型并不总是遵循.net设计所采用的命名规则和设计模式。

五、Visual Basic的"优势"

    C# 4.0发布之前(虽然现在也没有发布),用VB开发Office比用C#方便的多,这是因为VB简化了对Office对象模型的调用方法。但是随着C# 4.0的即将发布,VB的这种"优势"将会变得愈来愈小。园子里有很多人已经写过C# 4.0的新特性,这里仅提取出针对于COM操作的改进:

Improved COM Interoperability

C#中在调用COM对象如office对象时,经常需要写一堆不必要的参数:

object fileName = "Test.docx";

 

object missing  = System.Reflection.Missing.Value;

 

doc.SaveAs(ref fileName,

 

ref missing, ref missing, ref missing,

 

ref missing, ref missing, ref missing,

 

ref missing, ref missing, ref missing,

 

ref missing, ref missing, ref missing,

 

ref missing, ref missing, ref missing);

 

4.0中就可以直接写成:

doc.SaveAs("Test.docx");

 

C#4.0COM交互做了下面几方面的改进:

Automatic object -> dynamic mapping (自动类型转换)

Optional and named parameters (可选命名参数)

Indexed properties (索引属性?)

Optional "ref" modifier (可选 ref 修饰)

Interop type embedding ("No PIA") (主调程序集嵌入)

对第1点和第5点的简单解释如下:

COM调用中,很多输入输出类型都是object,这样就必须知道返回对象的确切类型,强制转换后才可以调用相应的方法。在4.0中有了dynamic的支持,就可以在导入这些COM接口时将变量定义为dynamic而不是object,省掉了强制类型转换。

PIAPrimary Interop Assemblies)是根据COM API生成的.Net Assembly,一般体积比较大。在4.0中运行时不需要PIA的存在,编译器会判断你的程序具体使用了哪一部分COM API,只把这部分用PIA包装,直接加入到你自己程序的Assembly里面。

六、开发工具

1Office 2007 Enterprise Edition With SP2或更新版本

2Visual Studio 2008 Team System With SP1 或更新版本

3OpenXML SDK 2.0

七、推荐资源

1、书籍:《VSTO 开发指南》,VSTO的权威著作,强烈推荐。

2、网站:

1)MSDN VSTO版块    

2)两位VSTO大师的博客,也是《VSTO 开发指南》的共同作者:

Eric Carter    Eric Lippert

3)Office 2010官方博客

八、VSTO 4.0 Hello World

最后,让我们用一个实例来结束本次研究:)

1、新建一个Office 2010的Excel Workbook项目:

2、在工作簿中添加一个按钮,添加一个Click事件:

3、弹出欢迎信息"

4、全部保存,F5运行:

一个最简单的VSTO 4.0项目就完成了。

 

九、小结:

    本次研究花费了大量篇幅叙述了VSTO的历史变迁及其历代版本中的增强功能,后续篇章会注意研究各功能的具体实现。本次的示例非常基本,基本可以忽略,但是却包括了创建一个完整的VSTO项目的全部步骤,后续练习将会在此基础上进行扩充,实现一些高级功能。

posted @ 2010-02-09 00:14  江苏瑞步科技  阅读(47354)  评论(10编辑  收藏  举报