王海波,王兆华
(中国传媒大学计算机与网络中心,北京 100024)
提供数据分析处理功能的Excel软件,在人们的日常工作中得到了广泛的使用。它可以应用于管理、统计、财经、金融等众多领域。在使用Excel时,人们经常使用Excel的查找功能来查找Excel文件中的数据。目前Excel提供列表的形式来显示查找到的所有数据。但在日常工作中,人们经常希望能够把查找到的结果用特殊的标记突出显示出来,或进一步把查找的数据直接复制到新的Excel文件中,而这些都是目前Excel所不能解决的。
本文通过Excel查找扩展组件SearchPro4Excel的开发,为Excel的查找功能提供了查找结果突出显示以及依据查找到的数据生成结果Excel文件的扩展功能。
为了对Excel软件进行扩展,笔者研究了对Excel软件进行扩展的方式以及Excel软件的数据模型。作为Office软件系列中的一种,Excel软件的扩展方式遵循Office软件扩展的统一方式。Excel软件的数据模型可以帮助人们获得Excel软件提供的对象及其具备的属性和方法,从而把查找扩展组件的功能与原有的Excel功能无缝地结合起来。
对于Office扩展软件来说,主要有以下3种开发方式[1-4]。
(1)独立的自动化可执行程序(Office Automation Executable)。
它以独立程序的方式运行。在独立程序中,对Office软件进行控制和自动化。独立程序在自己的进程中运行,和Office软件通过跨进程的通讯进行信息的交互。
(2)Office加载项(Office Add-in)。
它作为Office软件的加载项执行。当Office软件被运行时,加载项程序同时被启动。加载项程序运行在Office软件的进程中。
(3)Office文档程序(Code Behind an Office Document)。
它从传统的VBA开发环境衍化而来。它的代码嵌入在Office文档中。当用户打开包含程序的Office文档时,其中的程序同时被执行。
在Excel中,主要的对象模型如图1所示[5-7]。
图1 Excel对象模型
图1中,各主要对象的含义如表1所示。
表1 Excel对象模型含义
通过这些对象以及这些对象提供的属性和方法,可以对Excel中的各个对象进行操纵。
笔者在Visual Studio中采用Office加载项的方式来开发Excel查找功能扩展组件SearchPro4Excel。它的主要功能是对查找结果突出显示以及将查找到的数据生成结果Excel文件。
为了适应不同用户的习惯,SearchPro4Excel采用了任务窗格和对话框这两种交互方式,用户可以根据自己的需要选用其中的一种。为了给用户提供启动SearchPro4Excel的入口,需要对Excel的功能区进行扩展。笔者在Excel的“加载项”功能区增加了如图2所示两个功能按钮,分别用来启动查找任务窗格和查找对话框。
对于任务窗格来说,打开后它将位于Excel窗口的右侧,如图3所示。
图2 功能区按钮
图3 任务窗格
图3中包含的主要交互元素及其含义是:“查找内容”文本框:在Excel中查找的数据。
“突出显示”下拉列表:分“仅数据所在单元格”及“数据所在行”两个选项,用来设置突出显示的范围。
“查找结果复制到新的工作薄中”复选框:如果此复选项被选中,则自动把查找到的数据行复制到新的工作薄中,形成一个新的文件。
查找对话框的界面与查找任务窗格的界面基本相同,也包括上述这些交互元素。
2.2.1 功能区
通过Visual Studio中添加“功能区(可视化设计器)”可以在项目中增加一个功能区,并可以拖动控件中的“Button”以及“ToggleButton”到功能区的组中。
为了使得通过“ToggleButton”控制任务窗格的显示和隐藏,需要添加以下的成员变量:
2.2.2 交互控件数据获取
在查找面板中,对交互控件“查找内容”文本框、“突出显示”下拉列表、“查找结果复制到新的工作簿中”复选框分别赋以表2所示名称和变量。
获得用户输入数据的方式如下:
2.2.3 查找功能
查找功能主要借助Excel中Application对象的cells属性的find方法来实现。find方法的原型如表3所示。
expression.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SerchFormat)
表3 find方法原型
查找时的循环过程可以用如下流程来描述:
Step1 设置mCells为代表Excel文件所有单元格的变量。
Step2 currentFind=mCells.find(),使用用户输入的查找词作为参数。
Step3 While currentFind不为空
//对数据所在单元格进行突出显示处理
其中,currentFind是Range类型的对象,它表示查找到的数据所在单元格。
2.2.4 突出显示功能
根据用户的选择,可以突出显示查找数据所在的单元格或者查找数据所在的整行。
(1)突出显示查找数据所在的单元格:
其中,Interior是Range对象currentFind的属性,通过它可以改变currentFind的颜色,65535是用来进行突出显示的颜色值。
(2)突出显示查找数据所在的整行:
其中,通过currentFind.Row获得数据所在单元格的行,从而把数据所在行突出显示。
2.2.5 查找结果复制到新的工作簿中
如果用户选择把查找结果复制到新的工作簿中,则创建一个新的Excel工作薄文件,并把查找结果所在行复制到这一新的工作薄中。
其中,通过Application对象创建一个新的工作薄文件mNewBook,然后把查找到的数据所在行按照原来行的位置复制到这一新的工作薄中。
2.2.6 发布
在Visual Studio中,有内置的发布程序制作功能[8],如图4所示。通过这一功能,可以生成Search-Pro4Excel的安装包,从而可以在用户的计算机中进行安装。
图4 制作发布程序
除了SearchPro4Excel组件自身之外,还需要把以下4个程序组件安装到用户的计算机中:Windows Installer 3.1、.NET Framework 4、Visual Studio 2010 Tools for Office Runtime、Microsoft Office主互操作程序集。
对于某一Excel文件,希望对其中商品类别是“日用品”的数据行进行突出显示,通过点击“加载项”功能区的“查找任务窗格”按钮,在“查找任务窗格”中输入要查找的内容以及设置数据突出显示的方式为“数据所在行”,点击“查找”后,则对包含“日用品”的数据行自动进行以改变背景为方式的突出显示,如图5所示。
图5 突出显示的数据查找结果
如果用户选择了“查找结果复制到新的工作簿中”,则会生成一个新的Excel文件,并把含有“日用品”的数据行复制到这一新的Excel文件中,如图6所示。
图6 仅包含查找数据所在行的新文件
借助SearchPro4Excel的使用,用户可以直观地感受到所查找数据在Excel文件中的位置和分布,避免了Excel自身的查找功能只能列表显示数据所在位置的缺陷,并且可以以新文件的形式对查找数据所在行进行聚合。
针对Excel的查找功能不具备对查找到的数据进行突出显示的缺点,笔者开发完成了 Search-Pro4Excel这一针对Excel的查找功能扩展组件。通过对Excel的功能区和任务窗格的重新定制,形成了SearchPro4Excel与用户之间的交互界面。结合Excel提供的内置对象,完成了对Excel数据的查找以及突出显示的功能,并进一步可以把相关的数据以复制到新的Excel文件中的方式聚合起来。这一组件有效地补充了Excel的查找功能,在实际应用中可以辅助用户对数据进行分析,取得了良好的效果。
[1]Carter E,Lippert E.VSTO开发指南[M].王永,等译.北京:电子工业出版社,2008.
[2]McGrath K,Stubbs P.VSTO开发者指南[M].李永伦译.北京:机械工业出版社,2009.
[3]Carter E,Lippert E.Visual Studio Tools for Office[M].Addison Wesley,2006.
[4]McGrath K,Stubbs P.VSTO for Mere Mortals[M].Addison Wesley,2007.
[5]Steve S,Jeff W.Programming Excel with VBA and.NET[M].O’Reilly,2006.
[6]John W.Excel 2007 Power Programming with VBA[M].John Wiley& Sons,2007.
[7]Msdn.Excel对象模型概述[EB/OL].http://msdn.microsoft.com/zh-cn/library/wss56bz7,2012-09-21.
[8]Msdn.部署Office解决方案[EB/OL].http://msdn.microsoft.com/zh-cn/library/bb386179.asp,2012-09-21.
[9]余鹏飞,李海燕.基于COM Add-ins技术的Excel成绩统计插件开发[J].计算机与数字工程,2006,34(10):16-19.
[10]John Walkenbach.中文版Excel 2010高级VBA编程宝典[M].冉豪,等译.北京:清华大学出版社,2012.
[11]宋勇霖,杨逸翀,杨骏,等.基于VSTO开发Excel插件进行AHP分析的应用[J].医学信息:上旬刊,2011(9):5983-5985.
[12]Nick R,Michael M,David G.Visual Studio 2010高级编程[M].任鸿,等译.北京:清华大学出版社,2012.
[13]郑宇军,朱连军.新一代.NET Office开发指南:Excel篇[M].北京:清华大学出版社,2006.
[14]Stephen B,Rob B,John G.Excel专业开发[M].杜茂康,等译.北京:电子工业出版社,2007.
[15]伍远高.Excel VBA开发技术大全[M].北京:清华大学出版社,2009.