资源描述
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。
VSTO之旅系列(二): 创立Excel解决方案
-02-24 18:00:15
0
本专题概要
· 引言
· 创立VSTO项目
· Excel对象模型
· 创立Excel外接程序
· 创立Excel文档级自定义项
· 小结
一、 引言
可能很多朋友都没有听说过VSTO这个东西的, 本人之前也同样也不知道的, 可是由于工作的原因接触了这方面, 由于VSTO方面国内的资料比较少, 本人刚开始学习的时候都是参考MSDN的, 可是上面很多资料都是英文的, 可能学习起来会比较慢点, 因此本人把最近一段时间学习的内容记录下来, 一来是作为一个巩固的学习笔记, 二来希望这些博客能够帮助一些刚接触VSTO的朋友能够有所借鉴。
讲了这么多废话(指的上面一些过渡的话), 到底VSTO到底是什么呢?这里我简单的概括下的——VSTO是微软推出一种对Office产品进行操作的技术, 其中提供了一些类库来让开发人员能够更方便地开发出Office的解决方案,即对Word/Excel/Outlook实现一些扩展功能。 对于VSTO的更多介绍大家能够参看该系列的第一篇博文。在这个专题将为大家介绍下, 如何创立Excel的解决方案?
二、 创立VSTO项目
对于刚接触VSTO的朋友来说, 可能根本就不知道如何去创立一个VSTO的项目的, 相信经过这个部分大家就会觉得是如此的简单。
环境的搭建
进行VSTO开发的环境搭建是相当简单的, 只需要安装Visual Studio (当然安装VS 的时候在安装组件中必须勾选VSTO选择, 这个选项是默认勾上的。大家能够在安装VS的时候留意下)和Office 就能够, 当然VS 和Office 的安装也能够完成环境的搭建。
创立第一个Excel工程来开始我们的VSTO之旅
第一步, 选择新建项目->Visual C#->Office-> , 然后选择Excel 外接程序(如何是英文版即Excel Add-in), 如下图:
从图中能够看到, 除了外接程序外, 还有Excel模板和Excel文档这两种项目类型, 她们的区别是 外接程序是应用程序级别的, 即如果你创立了Excel 外接程序, 该程序对所有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文件时弹出一个欢迎界面,退出时弹出”谢谢使用”界面。
我们只需要在上面的创立工程中介入下面的代码即可:
using System.Windows.Forms;namespace MyExcelAddIn1{ public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 因为欢迎使用窗口要在打开Excel的时候弹出, 因此把下面代码放在Startup方法内 MessageBox.Show("欢迎使用Microsoft Excel"); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { // 在退出Excel的时候弹出谢谢使用窗口, 因此把下面的代码放在Shutdown方法内 MessageBox.Show("谢谢使用! "); } #region VSTO generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InternalStartup() { this.Startup += new System.EventHandler(ThisAddIn_Startup); this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); } #endregion }}
这样, 我们就完成了上面简单的一个模拟需求了, 下面让我们按F5来测试下效果吧!
按F5运行该程序时, 首先打开一个Excel之后, 一个欢迎界面就会弹出:
点击Excel窗口上的"X"按钮时, 就会弹出一个 ”谢谢使用! ”的窗口, 效果如下:
点击 Ok 按钮之后才会正常退出Excel。这样就完成了一个简单的Excel外接程序了, 上面提到过外接程序是应用程序级别的, 因此当你每次打开Excel的时候都会有这样的一个欢迎界面和关闭Excel时都有一个"谢谢使用"窗口,有些朋友想问了, 如果我想卸载这个插件怎么办呢? 方法很简单, 只需要右键你的解决方案——>清理, 这样能够了, 另外你也能够从开发工具选项卡——>COM 插件, 在弹出的窗口中选择你自定义的插件 再按下移除按钮。具体步骤见下图:
五、 创立Excel文档级自定义项
介绍完了创立Excel外接程序之后, 下面看看如何创立一个文档级的项目:
1. 新建一个Excel Workbook(即Excel工作簿)项目:
2. 单击 OK按钮, 在下面的窗口中单击 ”OK”按钮:
3. 在第一创立Excel工作簿项目是会弹出下面的一个窗口( 窗口意思为: 是否允许创立的项目访问VBA项目系统) , 此时我们只需要点击”Ok”就完成了Excel工作簿项目的创立。
现在我们来模拟一个需求, 比如现在有一个成绩单工作表, 我们希望获得各科目不及格同学的名字。此时我们只需要在上面创立的工作簿项目中添加一个ComboBox, 一个Button, 一个textbox。在button的Click事件中添加下面的代码:
// 找出各科目不及格同学的名字 private void btnSearch_Click(object sender, EventArgs e) { // 清除textbox中的内容 txtResult.Clear(); // 从复选框中获得选择的科目索引 int subjectIndex = cbxsubjects.SelectedIndex; if (subjectIndex == -1) { MessageBox.Show("请先选择一个科目"); return; } // 获得选择的科目名称 string subjectName = cbxsubjects.SelectedItem.ToString(); // 获得工作表对象 Excel.Worksheet worksheet =(Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet; for (int row = 2; row < worksheet.UsedRange.Rows.Count+1; row++) { Excel.Range rng =(Excel.Range)worksheet.Cells[row,subjectIndex + 2]; Excel.Range rng1 = (Excel.Range)worksheet.Cells[row, 1]; if (rng.Value< 60) { txtResult.Text += rng1.Value + "; "; } } if (txtResult.Text.Length == 0) { txtResult.Text = subjectName + "没有不及格的同学"; } }
运行该项目结果为:
六、 小结
到这里本专题的介绍就结束了, 本专题首先主要介绍了Excel的对象模型和如何创立Excel的两种项目类型, 希望经过本专题大家能够开发出一些简单的Excel的解决方案, 后面一个专题将为大家介绍如何为Excel自定义一个选项卡和上下文菜单。
专题源码:
VSTO之旅系列(三): 自定义Excel UI
-03-04 01:00:17
0
本专题概要
· 引言
· 自定义任务窗体(Task Pane)
· 自定义选项卡, 即Ribbon
· 自定义上下文菜单
· 小结
引言
在上一个专题中为大家介绍如何创立Excel的解决方案,相信大家经过从上面一个专题之后了解了Excel的对象模型, 以及Office两种解决方案的, 看完上一个专题之后, 肯定很多朋友想为Excel自定义属于自己的UI界面, 例如, 有这样的一些疑问——是否能够使用VSTO来自定义选项卡呢? 是否能够自定义上下文菜单的呢? 如果你也有这些疑问的话, 相信经过本专题你将会得到答案的, 下面就开始我们本专题的介绍。
二、 自定义任务窗体
在使用Word 的时候我们能够经过左边的导航来看了解文档的结构, 同时我们也能够在输入框的地方输入文字来进行搜索, 然而这个左边的导航就是一个任务窗体, 相信经过下面的图大家能够理解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浏览器, 自定义任务窗体的代码如下:
public partial class ThisAddIn { // 定义一个任务窗体 internal Microsoft.Office.Tools.CustomTaskPane helpTaskPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 把自定义窗体添加到CustomTaskPanes集合中 // ExcelHelp 是一个自定义控件类 helpTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new ExcelHelp(""), "Excel Help"); // 使任务窗体可见 helpTaskPane.Visible = true; // 经过DockPosition属性来控制任务窗体的停靠位置, // 设置为 MsoCTPDockPosition.msoCTPDockPositionRight这个代表停靠到右边, 这个值也是默认值 //helpTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight; } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } }
三、 自定义选项卡, 即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 中内置的Control ID 列表, 大家能够从下面这个链接下载:
Office System Document: Lists of Control IDs
2. 从工具箱中拖出一个ToggleButton, 把Label属性设置为Help, 并把ControlSize属性设置为RibbonControlSizeLarge:
3. 双击 Help ToggleButton按钮, 实现它的单击事件:
// 帮助选项卡中toggleButton的单击事件 private void toggleHelpBtn_Click(object sender, RibbonControlEventArgs e) { // 经过toggleHelpButton的选中状态来控制帮助任务栏的显示和隐藏 Globals.ThisAddIn.helpTaskPane.Visible = toggleHelpBtn.Checked; }
经过上面的三步也就完成了一个Ribbon的创立了, 当我们创立好一个Ribbon之后, 我们能够经过我们自定义的Ribbon下的按钮来显示/隐藏我们的任务窗体, 可是到这里, Ribbon的开发并没有结束, 此时还有一个问题就是——当我们点击 ”Excel help”右上角的X按钮关闭时, 我们Ribbon下的按钮状态也要跟着更变(大家能够测试, 当我们关闭Word中的导航任务窗体时, 试图下的"导航窗格"复选框”也会跟着改变), 此时我们就需要实现: 点击关闭按钮与Help按钮状态同步的功能的, 此时我们只需要对TaskPane的VisibleChanged事件进行处理就能够( 因为关闭任务窗体就会触发该事件, 因此只需要把同步状态的代码放在该事件就能够了),具体代码如下:
// 定义一个任务窗体 internal Microsoft.Office.Tools.CustomTaskPane helpTaskPane; private void ThisAddIn_Startup(object sender, System.EventArgs e) { // 把自定义窗体添加到CustomTaskPanes集合中 // ExcelHelp 是一个自定义控件类 helpTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(new ExcelHelp(""), "Excel Help"); // 使任务窗体可见 //helpTaskPane.Visible = true; // 经过DockPosition属性来控制任务窗体的停靠位置, // 设置为 MsoCTPDockPosition.msoCTPDockPositionRight这个代表停靠到右边, 这个值也是默认值 //helpTaskPane.DockPosition = MsoCTPDockPosition.msoCTPDockPositionRight; // 当用户点击 ”Excel help”右上角的X按钮关闭时, 我们需要同步选项卡上button的状态 helpTaskPane.VisibleChanged += new EventHandler(helpTaskPane_VisibleChanged); // 添加上下文菜单 //AddToCellMenu(); } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { } // 用户点击 "Excel Help" 侧边栏右上角的X按钮关闭它时 // 我们需要正确同步 ”帮助”按钮的状态 // 我们能够经过处理 ”Excel Help”侧边栏的VisualChanged 事件完成 private void helpTaskPane_VisibleChanged(object sender, EventArgs e) { // 获得Help Ribbon 对象 Help helpRibbon = Globals.Ribbons.GetRibbon<Help>(); // 同步Help Ribbon下的"帮助"按钮的状态 helpRibbon.toggleHelpBtn.Checked = Globals.ThisAddIn.helpTaskPane.Visible; }
运行效果图为:
四、 自定义上下文菜单
看完上面两部分的实现之后, 我在学习的过程中又想——能不能经过右键菜单来显示/隐藏任务窗体呢? 对于这点VSTO也是能够做到的, 我们只需要添加CommandBarButton对象( 当我们右键一个单元格(即为Cell)的时候,我们能够看到一上下文菜单, 菜单内所有控件(不论是按钮还是排序这样的菜单控件)) , 然后设置该对象的属性和添加一个Click事件, 主要代码如下:
// 添加一个自定义按钮到单元格上下文菜单中 contextMenu =Application.CommandBars["Cell"]; CommandBarButton commandBarbtn = (CommandBarButton)contextMenu.Controls.Add(MsoControlType.msoControlButton, Before: 1); commandBarbtn.Tag = "Help_Tag"; commandBarbtn.Caption = "查看帮助"; commandBarbtn.FaceId = 49; commandBarbtn.Click+=new _CommandBarButtonEvents_ClickEventHandler(commandBarbtn_Click);
运行效果为(这样我们右键Cell的时候就会多出一个我们自己定义的 ”查看帮助”按钮):
五、 小结
到这里本专题的内容就介绍完了, 本专题主要介绍如何为Excel创立一个自定义的任务窗体、 Ribbon和上下文菜单, 对于Word和Outlook这部分的内容我就不重复介绍, 创立方式和Excel的创立方式很类似。在下一个专题中我将给大家介绍下如何创立Word解决方案。
本专题所有源码:
展开阅读全文