VSTO之旅系列(一):VSTO入门_vsto normal撖寡情-程序员宅基地

技术标签: # VSTO之旅系列  

写在前面:本博客所有VSTO之旅系列均来自于网络,一切权益归原作者所有,由于原文价值较高,受到多次转载,此处转载仅为学习之用,转载时对原文部分进行了简要修改,向原作者致敬。

引言

因为工作的原因,这段时间一直在看VSTO的相关的内容的,因此希望通过这个系列来记录下我学习的过程和大家分享Office开发的相关知识,希望以后有朋友从事这方面的也希望通过本系列提供点帮助。
本专题将简单介绍VSTO和VSTO中的一些基本概念进行介绍,下面就直接进入正题了。

1 VSTO介绍

首先介绍下VSTO的历史吧,之前都是用VBA来开发Office解决方案的,后来微软开发出了VSTO这个工具包来创建自定义的Office应用程序,使得开发Office应用程序更加简单,并且用VSTO来开发office应用程序可以使用Visual studio开发环境中的众多功能和CLR提供的内存管理,垃圾回收等功能。VSTO到现在有5个版本的,下面通过一张图来说明VSTO的发展过程:
在这里插入图片描述
通过上图简单介绍下VSTO的发展历程的,这里也就不多描述VSTO的历史了,只是让大家有个这样的认识,下面就具体介绍下什么是VSTO。
当你创建VSTO解决方案时,你是在Visual Studio IDE里开始的。这里,你可以选择为Word或Excel创建文档或模板解决方案,或者为Outlook创建插件解决方案。如果你创建Outlook插件,它将对整个Outlook应用程序可用。如果你选择创建Word或者Excel文档,则代码仅对该文档可用。如果你选择Word或者Excel模板,代码会对任何用该模板创建的文档可用。
当你用VSTO创建Word或者Excel定制程序时,你可以在Visual Studio里访问完整的Word或者Excel应用程序和对象模型。当你创建插件时,你可以通过Application对象访问应用程序里的所有对象,但你不能在Visual Studio里直接访问应用程序。
你为文档级别的VSTO解决方案写的代码是储存在与文档相关联的代码文件里的。这通常称为代码隐藏文件(code-behind file),因为代码是以程序集的形式而不是VBA那样的内嵌代码在后台提供文档的功能的。当代码文件编译成程序集(DLL)时,它就与文档关联起来了。编译后的代码仅在文档级别可见(在应用程序级别不可见)。
你也可以创建基于Excel模板或者Word模板的VSTO解决方案。如果是那样的话,每当基于那个模板的文档打开时,你的VSTO定制程序的代码将会运行。你不能用VSTO为Word 2003和Excel 2003创建应用程序级别的定制程序,然而,你可以用VSTO 2005 SE为多个Office应用程序(包括Word 2003和Excel 2003)创建应用程序级别的插件。
用VSTO和VSTO 2005 SE创建的应用程序级别的插件会在应用程序启动时加载,在应用程序关闭时卸载。用户也可以手动加载和卸载插件。你可以创建插件来定制你的应用程序的用户界面,例如在Excel 2003里添加新的菜单或者菜单项,在Word 2007的功能区里添加按钮,或者在某个应用程序事件触发时执行特定操作。
使用VBA,你可以通过在全局模板里添加代码为Word创建应用程序级别的定制程序。这可能是Normal.dot模板,或者你存放在启动目录里从而使之对应用程序全局可见的自定义模板。VSTO并不支持这种做法,因为VSTO创建的定制程序仅对单个文档而不是在Word里打开的每个文档有效。如果你用Word模板创建VSTO定制程序,然后把它存放在启动目录里,与该模板相关联的定制程序代码并不对所有打开的文档可用,它仅在基于该模板的文档打开时运行。如果你想为Word创建应用程序级别的定制程序,你应该用VSTO 2005 SE创建插件项目。
当你用VBA定制Excel时,你可以使用Excel插件文件(.xla文件)的应用程序级别的插件。然而,你不能创建使用现存.xla文件的VSTO解决方案,因为项目创建的过程并不支持这种文件。虽然你可以创建一个Excel的VSTO解决方案,然后把文件保存成运行定制程序代码的.xla文件,但Microsoft并不支持这种做法。
实际上VSTO就是一个创建自定义Office应用程序的Visual Studio工具包,这个工具包里面提供了很多类库来让我们调用,然后工具包中类再与Office客户端进行交互。
打开VS2010后可以看到现在支持的一些模版,下面就是VS2010中支持模版的一张图片:
在这里插入图片描述
从图中可以看出创建的Office应用程序大致有三类:插件(Add-in),文档级别(如Excel Workbook)和模版(Template)。创建的Add-in和模版应用程序即应用程序级别的定制程序,它指的是对整个应用程序都可用。文档级别的应用程序指的是程序代码只关联到特定的文档二不是整个应用程序,然而需要注意的,文档级别的应用程序的代码并不像VBA程序那样存放在文档或模版里的,而是存放在项目的程序集中的。

2 主互操作程序集(PIA)的介绍

Office应用程序如Word,Excel和Outlook都是用非托管代码来写的, 而我们创建的VSTO工程使用的是托管代码,这时候就需要使用互操作程序集来与Office应用程序里的非托管COM对象交互,然后主互操作程序集(PIA)指的是官方发布的互操作程序集,如果电脑中安装了PIA,当你添加对类库的引用时,那么Visual Studio会自动加载PIA,微软为Office应用程序提供了PIA,如EXcel PIA就是Microsof.Office.Interop.Excel.dll,其他应用程序也类似。当安装了Office产品后,PIA会自动安装在电脑的GAC目录里,每当创建一个VSTO解决方案, Visual Studio会自动为该解决方案加载合适的Office PIA引用和其他程序集,具体PIA目录见下图:
在这里插入图片描述
如果安装完Office产品后没有安装相应的PIA到GAC,可以执行Office的安装程序进行修复。

3 宿主项和宿主控件的介绍

宿主项是表示Office对象模型入口点的类。应用程序外接程序使用Microsoft.Office.Tools.AddIn类为宿主项,此宿主项提供对宿主应用程序和成员的对象模型的访问,可以通过宿主项添加数据绑定的能力和提供额外的事件来扩展本地Office文档。而创建一个Excel解决方案会创建4个Excel宿主项:Workbook,Sheet1,Sheet2和Sheet3,如下图:
在这里插入图片描述
宿主项是Word和Excel等设计界面,担当控件容器的作用,就像VBA里把控件添加到UserForm上一样,我们可以把Windows Form 控件和宿主控件添加到宿主项上,值得注意的是Workbook宿主项,它不作为宿主控件的容器,在工作簿宿主项中不能添加控件只能包含组件。
宿主项控件了Office的对象模型,它是基于本机Office对象的,本机Office对象使用的是Microsoft.Office.Interop.Word命名控件下定义的类型而宿主项和宿主控件定义在Microsoft.Office.Tools.Word(Excel)等命名控件下的。宿主控件与本机对象的功能类似,但是宿主控件扩展了本机对象,添加了数据绑定和事件等功能

4 总结

到这里本专题要介绍的内容已经讲完了,后面的专题将介绍利用VSTO来创建自定义的Office应用程序,如果大家有关于Office想实现的功能也可以在下面留言,后面通过学习也会和大家分享大家想要实现的功能,希望在这里我们一起讨论,一起进步。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CVSTO/article/details/104219386

智能推荐

机器学习模型评分总结(sklearn)_model.score-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏129次。文章目录目录模型评估评价指标1.分类评价指标acc、recall、F1、混淆矩阵、分类综合报告1.准确率方式一:accuracy_score方式二:metrics2.召回率3.F1分数4.混淆矩阵5.分类报告6.kappa scoreROC1.ROC计算2.ROC曲线3.具体实例2.回归评价指标3.聚类评价指标1.Adjusted Rand index 调整兰德系数2.Mutual Informa..._model.score

Apache虚拟主机配置mod_jk_apache mod_jk 虚拟-程序员宅基地

文章浏览阅读344次。因工作需要,在Apache上使用,重新学习配置mod_jk1. 分别安装Apache和Tomcat:2. 编辑httpd-vhosts.conf: LoadModule jk_module modules/mod_jk.so #加载mod_jk模块 JkWorkersFile conf/workers.properties #添加worker信息 JkLogFil_apache mod_jk 虚拟

Android ConstraintLayout2.0 过度动画MotionLayout MotionScene3_android onoffsetchanged-程序员宅基地

文章浏览阅读335次。待老夫kotlin大成,扩展:MotionLayout 与 CoordinatorLayout,DrawerLayout,ViewPager 的 交互众所周知,MotionLayout 的 动画是有完成度的 即Progress ,他在0-1之间变化,一.CoordinatorLayout 与AppBarLayout 交互时,其实就是监听 offsetliner 这个 偏移量的变化 同样..._android onoffsetchanged

【转】多核处理器的工作原理及优缺点_多核处理器怎么工作-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏19次。【转】多核处理器的工作原理及优缺点《处理器关于多核概念与区别 多核处理器工作原理及优缺点》原文传送门  摘要:目前关于处理器的单核、双核和多核已经得到了普遍的运用,今天我们主要说说关于多核处理器的一些相关概念,它的工作与那里以及优缺点而展开的分析。1、多核处理器  多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核),此时处理器能支持系统总线上的多个处理器,由总..._多核处理器怎么工作

个人小结---eclipse/myeclipse配置lombok_eclispe每次运行个新项目都需要重新配置lombok吗-程序员宅基地

文章浏览阅读306次。1. eclipse配置lombok 拷贝lombok.jar到eclipse.ini同级文件夹下,编辑eclipse.ini文件,添加: -javaagent:lombok.jar2. myeclipse配置lombok myeclipse像eclipse配置后,定义对象后,直接访问方法,可能会出现飘红的报错。 如果出现报错,可按照以下方式解决。 ..._eclispe每次运行个新项目都需要重新配置lombok吗

【最新实用版】Python批量将pdf文本提取并存储到txt文件中_python批量读取文字并批量保存-程序员宅基地

文章浏览阅读1.2w次,点赞31次,收藏126次。#注意:笔者在2021/11/11当天调试过这个代码是可用的,由于pdfminer版本的更新,网络上大多数的语法没有更新,我也是找了好久的文章才修正了我的代码,仅供学习参考。1、把pdf文件移动到本代码文件的同一个目录下,笔者是在pycharm里面运行的项目,下图中的x1文件夹存储了我需要转换成文本文件的所有pdf文件。然后要在此目录下创建一个存放转换后的txt文件的文件夹,如图中的txt文件夹。2、编写代码 (1)导入所需库# coding:utf-8import ..._python批量读取文字并批量保存

随便推点

Scala:访问修饰符、运算符和循环_scala ===运算符-程序员宅基地

文章浏览阅读1.4k次。http://blog.csdn.net/pipisorry/article/details/52902234Scala 访问修饰符Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public。Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层_scala ===运算符

MySQL导出ER图为图片或PDF_数据库怎么导出er图-程序员宅基地

文章浏览阅读2.6k次,点赞7次,收藏19次。ER图导出为PDF或图片格式_数据库怎么导出er图

oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...-程序员宅基地

文章浏览阅读655次。CREATE OR REPLACE TRIGGER Trg_ReimFactBEFORE UPDATEON BP_OrderFOR EACH ROWDECLAREPRAGMA AUTONOMOUS_TRANSACTION;--自制事务fc varchar2(255);BEGINIF ( :NEW.orderstate = 2AND :NEW.TransState = 1 ) THENBEG..._oracle触发器更新同一张表

debounce与throttle区别及其应用场景_throttle和debounce应用在哪些场景-程序员宅基地

文章浏览阅读513次。目录概念debouncethrottle实现debouncethrottle应用场景debouncethrottle场景举例debouncethrottle概念debounce字面理解是“防抖”,何谓“防抖”,就是连续操作结束后再执行,以网页滚动为例,debounce要等到用户停止滚动后才执行,将连续多次执行合并为一次执行。throttle字面理解是“节流”,何谓“节流”,就是确保一段时..._throttle和debounce应用在哪些场景

java操作mongdb【超详细】_java 操作mongodb-程序员宅基地

文章浏览阅读526次。regex() $regex 正则表达式用于模式匹配,基本上是用于文档中的发现字符串 (下面有例子)注意:若未加 @Field("名称") ,则识别mongdb集合中的key名为实体类属性名。也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。_java 操作mongodb

github push 推送代码失败. 使用ssh rsa key. remote: Support for password authentication was removed._git push remote: support for password authenticati-程序员宅基地

文章浏览阅读1k次。今天push代码到github仓库时出现这个报错TACKCHEN-MB0:tc-image tackchen$ git pushremote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.remote: Please see https://github.blog/2020-12-15-token-authentication_git push remote: support for password authentication was removed on august 1