创建Excel解决方案.docx
- 文档编号:4526054
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:17
- 大小:1.06MB
创建Excel解决方案.docx
《创建Excel解决方案.docx》由会员分享,可在线阅读,更多相关《创建Excel解决方案.docx(17页珍藏版)》请在冰豆网上搜索。
创建Excel解决方案
VSTO之旅系列
(二):
创建Excel解决方案
2013-02-2418:
00:
15
0
本专题概要
∙引言
∙创建VSTO项目
∙Excel对象模型
∙创建Excel外接程序
∙创建Excel文档级自定义项
∙小结
一、引言
也许很多朋友都没有听说过VSTO这个东西的,本人之前也同样也不知道的,但是由于工作的原因接触了这方面,由于VSTO方面国内的资料比较少,本人刚开始学习的时候都是参考MSDN的,但是上面很多资料都是英文的,可能学习起来会比较慢点,所以本人把最近一段时间学习的内容记录下来,一来是作为一个巩固的学习笔记,二来希望这些博客可以帮助一些刚接触VSTO的朋友可以有所借鉴。
讲了这么多废话(指的上面一些过渡的话),到底VSTO到底是什么呢?
这里我简单的概括下的——VSTO是微软推出一种对Office产品进行操作的技术,其中提供了一些类库来让开发人员可以更方便地开发出Office的解决方案,即对Word/Excel/Outlook实现一些扩展功能。
对于VSTO的更多介绍大家可以参看该系列的第一篇博文。
在这个专题将为大家介绍下,如何创建Excel的解决方案?
二、创建VSTO项目
对于刚接触VSTO的朋友来说,可能根本就不知道如何去创建一个VSTO的项目的,相信通过这个部分大家就会觉得是如此的简单。
环境的搭建
进行VSTO开发的环境搭建是相当简单的,只需要安装VisualStudio2010(当然安装VS2010的时候在安装组件中必须勾选VSTO选择,这个选项是默认勾上的。
大家可以在安装VS的时候留意下)和Office2010就可以,当然VS2008和Office2007的安装也可以完成环境的搭建。
创建第一个Excel工程来开始我们的VSTO之旅
第一步,选择新建项目->VisualC#->Office->2010,然后选择Excel2010外接程序(如何是英文版即Excel2010Add-in),如下图:
从图中可以看到,除了外接程序外,还有Excel模板和Excel文档这两种项目类型,他们的区别是外接程序是应用程序级别的,即如果你创建了Excel2010外接程序,该程序对所有Excel应用都是有效的,因为每次Excel的启动过程都会加载该插件(即该程序),大家肯定留意到当我们启动Excel或Word的时候都会加载一些加载项,其实这些加载项就是属于外接程序,即插件,启动过程见下面图:
而文档和模板项目,都是属于文档级别的程序,该程序只对当前文档和模板有效,创建这两种类型的项目,会在项目的工程目录下会生成一个word文件(文档项目会生成一个Document1.docx文件,模板项目会生成一个Document1.dotx文件)。
创建成功之后,外接程序的项目文件结构见下图:
从图中可以看出,刚创建的VSTO外接程序都只有一个ThisAddIn.cs文件,该文件即是一个宿主项(更多关于宿主项和宿主控件的内容可以查看该系列的第一篇博文),我们可以通过这个文件来对Excel对象进行访问。
同时该类中有ThisAddIn_Startup和ThisAddIn_Shutdown两个方法,从两个方法中命名中可以知道,如果你的代码想在加载外接程序时运行的话,就放把代码放在ThisAddIn_Startup方法内容,如果你想在外接程序卸载的时候运行你的代码,就把这些代码放在ThisAddIn_Shutdown方法内。
三、Excel对象模型
要开发Excel的项目,就自然少不了对Excel对象模型的了解了,只有了解Excel对象模型,这样才能更好地对Excel进行处理。
下面先给出一张Excel对象模型的图:
下面就具体对上图中的各个对象做一个简单的介绍:
Application对象——Excel中的Application对象表示Excel应用程序,该对象是所有Excel对象的根,你可以通过Application对象,获取到其他对象,在外接程序中,我们可以通过下面的方式来获得Application对象:
Globals.ThisAddIn.Application
Workbooks对象代表Workbook对象的集合,而Workbook对象表示Excel中的单个工作簿,我们可以通过下面的方式来获得工作簿对象:
Globals.ThisAddIn.Application.ThisWorkbook
Worksheets对象代表Worksheet对象的集合,而Worksheet代表的就是Excel中的表,下面的代码可以获得Worksheet对象:
Globals.ThisAddIn.Application.ThisWorkbook.ActiveSheet(激活的表,每次打开一个Excel文件,都是表一即sheet1被激活,所以通过该代码就说获得表一对象)
Range对象代表一个范围,是操作Excel文档最常用的对象,它可以表示为一个单元格、一行、一列或多个单元格块(可以连续,也可以不连续)的单元格选定范围,甚至多个工作表中的一组单元格。
可能上面的解释过于枯燥,相信大家通过下图可以更好地理解Excel中的各个对象:
四、创建Excel外接程序
介绍完了Excel对象模型之后,我们就可以利用这些对象来对Excel文档进行操作了,下面就创建一个简单的Excel外接程序的。
首先我们模拟一个需求,大多说软件在使用时都会弹出一个欢迎界面,这样我们就创建一个外接程序,每次打开Excel文件时弹出一个欢迎界面,退出时弹出“谢谢使用”界面。
我们只需要在上面的创建工程中介入下面的代码即可:
usingSystem.Windows.Forms;namespaceMyExcelAddIn1{publicpartialclassThisAddIn{privatevoidThisAddIn_Startup(objectsender,System.EventArgse){//因为欢迎使用窗口要在打开Excel的时候弹出,所以把下面代码放在Startup方法内MessageBox.Show("欢迎使用MicrosoftExcel");}privatevoidThisAddIn_Shutdown(objectsender,System.EventArgse){//在退出Excel的时候弹出谢谢使用窗口,所以把下面的代码放在Shutdown方法内MessageBox.Show("谢谢使用!
");}#regionVSTOgeneratedcode///
这样,我们就完成了上面简单的一个模拟需求了,下面让我们按F5来测试下效果吧!
按F5运行该程序时,首先打开一个Excel之后,一个欢迎界面就会弹出:
点击Excel窗口上的"X"按钮时,就会弹出一个“谢谢使用!
”的窗口,效果如下:
点击Ok按钮之后才会正常退出Excel。
这样就完成了一个简单的Excel外接程序了,上面提到过外接程序是应用程序级别的,所以当你每次打开Excel的时候都会有这样的一个欢迎界面和关闭Excel时都有一个"谢谢使用"窗口,有些朋友想问了,如果我想卸载这个插件怎么办呢?
方法很简单,只需要右键你的解决方案——>清理,这样可以了,另外你也可以从开发工具选项卡——>COM插件,在弹出的窗口中选择你自定义的插件再按下移除按钮。
具体步骤见下图:
五、创建Excel文档级自定义项
介绍完了创建Excel外接程序之后,下面看看如何创建一个文档级的项目:
1.新建一个Excel2010Workbook(即Excel工作簿)项目:
2.单击OK按钮,在下面的窗口中单击”OK“按钮:
3.在第一创建Excel工作簿项目是会弹出下面的一个窗口(窗口意思为:
是否允许创建的项目访问VBA项目系统),此时我们只需要点击“Ok”就完成了Excel工作簿项目的创建。
现在我们来模拟一个需求,比如现在有一个成绩单工作表,我们希望获得各科目不及格同学的名字。
此时我们只需要在上面创建的工作簿项目中添加一个ComboBox,一个Button,一个textbox。
在button的Click事件中添加下面的代码:
//找出各科目不及格同学的名字privatevoidbtnSearch_Click(objectsender,EventArgse){//清除textbox中的内容txtResult.Clear();//从复选框中获得选择的科目索引intsubjectIndex=cbxsubjects.SelectedIndex;if(subjectIndex==-1){MessageBox.Show("请先选择一个科目");return;}//获得选择的科目名称stringsubjectName=cbxsubjects.SelectedItem.ToString();//获得工作表对象Excel.Worksheetworksheet=(Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;for(introw=2;row 运行该项目结果为: 六、小结 到这里本专题的介绍就结束了,本专题首先主要介绍了Excel的对象模型和如何创建Excel的两种项目类型,希望通过本专题大家可以开发出一些简单的Excel的解决方案,后面一个专题将为大家介绍如何为Excel自定义一个选项卡和上下文菜单。 专题源码: VSTO之旅系列(三): 自定义ExcelUI 2013-03-0401: 00: 17 0 本专题概要 ∙引言 ∙自定义任务窗体(TaskPane) ∙自定义选项卡,即Ribbon ∙自定义上下文菜单 ∙小结 引言 在上一个专题中为大家介绍如何创建Excel的解决方案,相信大家通过从上面一个专题之后了解了Excel的对象模型,以及Office两种解决方案的,看完上一个专题之后,肯定很多朋友想为Excel自定义属于自己的UI界面,例如,有这样的一些疑问——是否可以使用VSTO来自定义选项卡呢? 是否可以自定义上下文菜单的呢? 如果你也有这些疑问的话,相信通过本专题你将会得到答案的,下面就开始我们本专题的介绍。 二、自定义任务窗体 在使用Word2010的时候我们可以通过左边的导航来看了解文档的结构,同时我们也可以在输入框的地方输入文字来进行搜索,然而这个左边的导航就是一个任务窗体,相信通过下面的图大家可以理解Word中那部分是一个任务窗体: 但是我们在使用Excel中却没有找到类似的任务窗体,这时候大家肯定会有这样一个疑问——如果我想在Excel也想实现一个自定义任务窗体该怎么办呢? 用VSTO可以帮我们办到吗? 答案是肯定的。 首先先模拟一个需求的,相信大家都知道使用F1是打开一个帮助文档,但是弹出的帮助文档是与Excel在不同界面的,所以很多朋友在查阅帮助的文档的时候都需要缩小Excel文档来查阅,这样就显得有些不方便了,我在使用的时候就想,能不能把帮助文档继承在Excel的右边呢? 这样我们查阅Excel帮助文档就方便多了,就不要缩小Excel文档,或在Excel和帮助文档之间左右切换了。 既然有这种需求,我们就有实现它的必要性,下面就具体说说如何实现的: 首先在看具体代码之前,我向大家分析下实现一个任务窗体的思路: ∙首先,任务窗体是一个窗体,当然就需要在创建的Excel解决方案中创建一个窗体的了,这里我们创建了一个用户控件。 ∙创建和设计完用户控件的界面之后,我们就需要把这个用户控件添加到Excel中去了,然而我们在以前的接触的开发中,添加控件都是把控件添加到某个几个中去的,例如WinForm中要向窗体添加一个button按钮,就需要把这个button添加进Controls集合中,同样VSTO也提供这样一个把任务面板添加进去的集合—— Microsoft.Office.Tools.CustomTaskPaneCollection,我们可以通过 Globals.ThisAddIn.CustomTaskPanes这行代码来获得这个集合,然后调用Add方法就可以把我们自定义的任务面板添加进Excel中了。 ∙添加进去之后,我们还需要使任务面板显示出来,这样就涉及了Visible属性了,确实 Microsoft.Office.Tools.CustomTaskPane也有Visible属性 有了上面的分析过程之后,相信大家看下面的代码会比较容易理解,另外注意的一点是,因为我们要实现的帮助文档的任务窗体,由于帮助文档是在浏览器中显示的,这样我们就需要集成一个浏览器到我们的创建的用户控件中的,大家看到浏览器这个词可千万不要觉得有所畏惧,因为微软提供了WebBrowser控件来帮助我们实现,对于浏览器的更多内容可以参看我的这篇博客: 自定义Web浏览器,自定义任务窗体的代码如下: publicpartialclassThisAddIn{//定义一个任务窗体internalMicrosoft.Office.Tools.CustomTaskPanehelpTaskPane;privatevoidThisAddIn_Startup(objectsender,System.EventArgse){//把自定义窗体添加到CustomTaskPanes集合中//ExcelHelp是一个自定义控件类helpTaskPane=Globals.ThisAddIn.CustomTaskPanes.Add(newExcelHelp(""),"ExcelHelp");//使任务窗体可见helpTaskPane.Visible=true;//通过DockPosition属性来控制任务窗体的停靠位置,//设置为MsoCTPDockPosition.msoCTPDockPositionRight这个代表停靠到右边,这个值也是默认值//helpTaskPane.DockPosition=MsoCTPDockPosition.msoCTPDockPositionRight;}privatevoidThisAddIn_Shutdown(objectsender,System.EventArgse){}} 三、自定义选项卡,即Ribbon 上面实现的任务窗体在Excel一打开的时候就会显示停靠在Excel的右边,如下图所示: 然而当我们点击任务窗体中的"X"按钮就是关闭任务窗体,关闭之后就有一个问题,如果我们又想把帮助任务窗体显示出来怎么办呢? 因为在Word中的导航窗体也不是一开始就显示的(有些朋友可能打开的Word文档没有导航窗体),此时我们通过勾选视图选项卡中“导航窗格”或点击开始选项卡中的查找按钮来显示导航窗体: 此时,我们就想在Excel中是否可以自定义一个选项卡,通过选项卡中按钮来显示/隐藏Excel的帮助任务窗体呢? 下面就具体介绍如何创建一个自定义选项卡: 1.右键你的Excel项目,添加—>新建项,在弹出的添加新项窗口中选择"功能区(可视化设计器)" 2.输入名称之后单击添加按钮 3.设计选项卡UI界面,本例子中添加了一个toggleButton. 通过上面的步骤就可以创建一个自定义选项卡,这种方式创建的选项卡在Excel项目(针对的是外接Excel项目类型)启动的时候就会被加载。 下面具体介绍了如何设计选项卡(即Ribbon): 1.设计RibbonTab,首先把ControlIdType属性设置为Custom,不然我们设计的RibbonGroup部分将会在加载项选项卡下,然后设置Name为HelpTab,这样我们创建的选项卡才会成为一个新的选项卡,如果我们想把ToggleButton放在Home选项卡下显示,此时我们只需要把ControlIdType设置为Office,然后把OfficeId设置为TabHome,具体情况大家可以测试看看的,关于Office中内置的ControlID列表,大家可以从下面这个链接下载: 2007OfficeSystemDocument: ListsofControlIDs 2.从工具箱中拖出一个ToggleButton,把Label属性设置为Help,并把ControlSize属性设置为RibbonControlSizeLarge: 3.双击HelpToggleButton按钮,实现它的单击事件: //帮助选项卡中toggleButton的单击事件privatevoidtoggleHelpBtn_Click(objectsender,RibbonControlEventArgse){//通过toggleHelpButton的选中状态来控制帮助任务栏的显示和隐藏Globals.ThisAddIn.helpTaskPane.Visible=toggleHelpBtn.Checked;} 通过上面的三步也就完成了一个Ribbon的创建了,当我们创建好一个Ribbon之后,我们可以通过我们自定义的Ribbon下的按钮来显示/隐藏我们的任务窗体,但是到这里,Ribbon的开发并没有结束,此时还有一个问题就是——当我们点击“Excelhelp”右上角的X按钮关闭时,我们Ribbon下的按钮状态也要跟着更变(大家可以测试,当我们关闭Word中的导航任务窗体时,试图下的"导航窗格"复选框“也会跟着改变),此时我们就需要实现: 点击关闭按钮与Help按钮状态同步的功能的,此时我们只需要对TaskPane的VisibleChanged事件进行处理就可以(因为关闭任务窗体就会触发该事件,所以只需要把同步状态的代码放在该事件就可以了),具体代码如下: //定义一个任务窗体internalMicrosoft.Office.Tools.CustomTaskPanehelpTaskPane;privatevoidThisAddIn_Startup(objectsender,System.EventArgse){//把自定义窗体添加到CustomTaskPanes集合中//ExcelHelp是一个自定义控件类helpTaskPane=Globals.ThisAddIn.CustomTaskPanes.Add(newExcelHelp(""),"ExcelHelp");//使任务窗体可见//helpTaskPane.Visible=true;//通过DockPosition属性来控制任务窗体的停靠位置,//设置为MsoCTPDockPosition.msoCTPDockPositionRight这个代表停靠到右边,这个值也是默认值//helpTaskPane.DockPosition=MsoCTPDockPosition.msoCTPDockPositionRight;//当用户点击“Excelhelp”右上角的X按钮关闭时,我们需要同步选项卡上button的状态helpTaskPane.VisibleChanged+=newEventHandler(helpTaskPane_VisibleChanged);//添加上下文菜单//AddToCellMenu();}privatevoidThisAddIn_Shutdown(objectsender,System.EventArgse){}//用户点击"ExcelHelp"侧边栏右上角的X按钮关闭它时//我们需要正确同步“帮助”按钮的状态//我们可以通过处理“ExcelHelp”侧边栏的VisualChanged事件完成privatevoidhelpTaskPane_VisibleChanged(objectsender,EventArgse){//获得HelpRibbon对象HelphelpRibbon=Globals.Ribbons.GetRibbon 运行效果图为: 四、自定义上下文菜单 看完上面两部分的实现之后,我在学习的过程中又想——能不能通过右键菜单来显示/隐藏任务窗体呢? 对于这点VSTO也是可以做到的,我们只需要添加CommandBarButton对象(当我们右键一个单元格(即为Cell)的时候,我们可以看到一上下文菜单,菜单内所有控件(不管是按钮还是排序这样的菜单控件)),然后设置该对象的属性和添加一个Click事件,主要代码如下: //添加一个自定义按钮到单元格上下文菜单中contextMenu=Application.CommandBars["Cell"];CommandBarButtoncommandBarbtn=(CommandBarButton)contextMenu.Controls.Add(MsoControlType.msoControlButton,Before: 1);commandBarbtn.Tag="Help_Tag";commandBarbtn.Caption="查看帮助";commandBarbtn.FaceId=49;commandBarbtn.Click+=new_CommandBarButtonEvents_ClickEventHandler(commandBarbtn_Click); 运行效果为(这样我们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创建 Excel 解决方案