Excel开发学习笔记:界面交互与控件的布局
遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具。在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵。
开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序。
除了业务逻辑之外,比较耗时耗力的就是人机交互了。在编写excel定制程序的过程中,这次用到了以下几种交互方式:
- 通过excel工作表(worksheet)获取用户输入
- 通过按钮控件触发功能代码执行
- 通过TreeView控件显示内容摘要及导航
- 通过自定义的windows窗体提供交互
工作表的操作放到后面再说,讲一下按钮控件button和Treeview控件的布局。
放置控件的方法:
无非可视化放置和运行时代码加载两种。可视化放置比较直观,通过visual studio的toolbox工具栏拖动需要的控件到工作表上或者自定义的windows窗体上,然后可以在设计界面设置控件的各种参数,在程序启动时自 动加载。代码加载则需要去msdn上查找各种控件开放的API接口,然后写代码调用API,在程序运行时由这些代码完成加载和参数设置。
控件的布局:
常见的有以下几种位置可供选择,适用于不同情况。
- excel worksheet上
- 操作窗格action pane(文档级自定义程序专用)
- Ribbon UI功能区(也就是excel2007上方的"开始"、"插入"菜单的位置)
另外,我们还可以在弹出的自定义windows窗体在上布局各种控件。Office UI自定义的官方介绍点击打开链接:http://msdn.microsoft.com/zh-cn/library/bf08984t.aspx
个人觉得操作窗格是很好用的一个布局区域,它通常位于office界面的侧面,类似windows文件夹界面左侧的导航栏,优势是区域够大且不影响 excel工作表界面。很多文章提到自定义任务窗格custom task pane的用法,我迷糊了好久才明白这东西是给外接程序add-ins用的,对应文档级程序中的操作窗格action pane,显示效果差不多。
1、工作表worksheet
最简单粗暴而有效的布局方式,将工作表作为放置控件的容器,直接从控件工具栏中拖动想要的控件到指定的位置,然后双击控件就可切换到代码视图,在想要的事件中添加功能代码即可。而且因为控件的事件代码是和工作表代码一起的,访问工作表的内容特别方便,很贴心。
比如下面的代码响应某个按钮的点击,直接给按钮所在工作表的第二行第一列的单元格赋值,内容是当前工作表的名称。
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Cells(, ).value = Name
MsgBox(Name)
End Sub
这种控件布局方式的缺点主要是干扰了工作表界面的正常操作,与工作表随心所欲的多变特性不般配,而且显示效果比较丑陋。适合快速开发的小工具,简单有效地解决业务问题即可。我最早也是将按控件放置在工作表上,后来都移走了。
2、操作窗格action pane
操作窗格没法在设计界面编辑,无法向其中拖动控件,只能写代码来完成控件的加载和设置。但我们可以在工程中添加一个用户控件(user control)或者操作窗格控件(action pane control),这2个control控件的作用就是作为其他控件的容器,分别位于工程右键菜单的add-->new item-->windows forms和new item-->office下面。可以向他们上面拖动你想要的其他控件,根据喜好设置好界面后,只需要用代码把control控件加载到操作窗格即 可,所有的内容都会自动显示出来。
加载控件到操作窗格的代码如下(以工作薄workbook中加载为例):
Public Class ThisWorkbook
'在过程外部声明添加到工程的control控件,作为类变量
Public actionControl As New ActionsPaneControl1 Private Sub ThisWorkbook_Startup() Handles Me.Startup
'加载control控件到操作窗格,ActionsPane要通过工作簿workbook来引用
ActionsPane.Controls.Add(actionControl)
'设置操作窗格的显示位置为左侧,注意获取操作窗格与添加control控件的差别
Application.CommandBars("Task Pane").Position = Microsoft.Office.Core.MsoBarPosition.msoBarLeft
End Sub
End Class
如果在worksheet代码中添加控件到操作窗格,需要通过Globals.ThisWorkbook.ActionsPane来引用。
效果图:

3、Ribbon UI功能区
office2007 自带的功能入口所在的区域,几经调整我最终把功能按钮放在了ribbon功能区。可以通过工程右键菜单-->add-->new item-->office-->ribbon新增自定义Ribbon功能区(我选择了visual designer模版)。然后就可以在设计器界面往新增的自定义功能区上添加控件了。
修改控件的大小:
属性窗口-->controlSize,默认小号
修改控件的图标:
属性窗口-->OfficeImageId,可以通过名称关联Office自带的图标,省去了自己找图标的麻烦。比如输入FileOpen就会在运行时显示为平时常见的打开文件的图标。可以在微软官网http://www.microsoft.com/en-us/download/details.aspx?id=11675下载到所有office图标所对应的OfficeImageId,也就是2007 Office System Add-In: Icons Gallery。
修改功能区的位置:
属性窗口-->position-->PositionType,默认是放在最后面,在我机器上也就是在"开发工具"功能区的后面。还可以选择 “beforeOfficeId”和“afterOfficeId”,分别表示我们的功能区域希望放在哪个功能区的前面或后面,这时还需要输入这个功能区 的officeId或名称。可以在微软官网http://www.microsoft.com/en-us/download/details.aspx?id=6627下载到所有office自带控件的详细情况,也就是Office 2010 Help Files: Office Fluent User Interface Control Identifiers。
这个帮助文档的内容实在太多,可以通过control Type列筛选“tab”关键字,可以发现这些ribbon功能区的命名规则很简单,Tab+功能区英文名,明白这个规则后可以省去查找的工作,比如“开 始”和“插入”功能区在excel英文版中显示为“Home”和“Insert”,那么我们只需要在OfficeId栏中输入TabHome和 TabInsert即可。如果想把自定义功能区显示在最前面,只需要选择beforeOfficeId,然后输入TabHome即可。
另外,VS2010的Ribbon设计器有bug,照上面的方法在界面设置beforeOfficeId和TabHome属性之后,运行会报错“The type 'Microsoft.VisualStudio.Tools.Office.Ribbon.View.GenericRibbonView' has no property named 'Factory'.”。还好Msdn社区有帖子说这个事,链接在此点击打开链接。好像是说由于vs2010在后台自动生成的ribbon界面代码不正确,报错位于ribbon1.designer.vb中的InitializeComponent函数内(ribbon1为添加ribbon功能区时的代码名称),将错误的语句剪切到InitializeComponent 函数的调用之后即可,比如把“Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")”剪切到下图位置。在我的工程中,这个位置就在错误语句的上方不远。
<System.Diagnostics.DebuggerNonUserCode()> _
Public Sub New()
MyBase.New(Globals.Factory.GetRibbonFactory()) 'This call is required by the Component Designer.
InitializeComponent()
'移到这里
Me.Tab1.Position = Me.Factory.RibbonPosition.BeforeOfficeId("TabHome")
End Sub
效果图:
Excel开发学习笔记:界面交互与控件的布局的更多相关文章
- Excel开发学习笔记:文件选择控件、查找匹配项、单元格格式及数据有效性
一个自用的基于excel的小工具. , ), .Cells(, )) sysKpiRow.Interior.ColorIndex = ).value = , ) ...
- IOS开发学习笔记019-动态创建控件
动态创建控件 一.按钮 二.文本输入框 三.lable标签 注意: 只是简单的拖拽控件会毁了你,所以最好还是手动通过代码创建控件. 如果要通过代码生成按钮的话,可以在系统自带的函数viewDidLoa ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
- Excel开发学习笔记:新建文档级的excel解决方案
工作中遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多 ...
- Duilib学习笔记《03》— 控件使用
在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...
- Android Studio 学习笔记(三):简单控件及实例
控件.组件.插件概念区分 说到控件,就不得不区分一些概念. 控件(Control):编程中用到的部件 组件(Component):软件的组成部分 插件(plugin): 应用程序中已经预留接口的组件 ...
- android开发学习笔记系列(4)--android动态布局
前言 在做一个有关苏果APP的项目中,但是fuck的是,我完全使用相对布局之后及线性布局之后发现坑爹的事情了,屏幕不能适配,这是多大的痛,意味着,必须使用相应的代码实现动态布局!呵呵,不做项目不知道, ...
- 第六周学习笔记,vc各类控件的输入输出
6w学习笔记 vc控件的输入输出 单选按钮 当单击 RadioButton 控件时,其 Checked 属性设置为 true,并且调用 Click 事件处理程序.当 Checked 属性的值更改时,将 ...
- c#学习笔记之使用 TableLayoutPanel 控件设置窗体布局
使用 TableLayoutPanel 控件设置窗体布局 在 Visual Studio IDE 左侧,找到“工具箱”选项卡. 选择“工具箱”选项卡,随即将显示工具箱.(或者,在菜单栏上,依次选择“视 ...
随机推荐
- 微信内置浏览器和小程序的 User Agent 区别及判断方法
通过UA来判断不同的设备或者浏览器是开发者最常用的方式方法,而对于微信开发和小程序也是同样的一个情况,我们可以通过微信内置浏览器 User Agent 信息来判断其具体类型或者设备. 所以子凡就通过徒 ...
- 导出android真机上应用的apk文件
1. 首先你的手机要开启调试模式 2. 终端输入命令行 (这个时候需要在手机端打开此应用.它的思路是抓取出当前窗口的包名.以下命令操作自己未亲自验证.) adb shell dumpsys windo ...
- HBase学习3(win下使用Eclipse搭建hbase开发环境)
第一步:创建一个java project命名为wujiadong_hbase 第二步:在该工程下创建一个folder命名为lib(储存依赖的jar包) 第三步:将集群中的hbase安装目录下载一份到w ...
- mapreduce 实现数子排序
设计思路: 使用mapreduce的默认排序,按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装为String ...
- JavaScript 正则表达收集整理
JavaScript 正则表达收集整理 //可为空 /^\s*$/ //密码验证,必须且只含有数字和字母,可以拥有英文符号,6-17位 /(?=.{,})(?=.*\d)(?=.*[a-z])[\x2 ...
- ADO.NET入门教程(一) 初识ADO.NET
摘要 作为.NET框架最重要的组件之一,ADO.NET扮演着应用程序与数据交互的重要的角色.本文将从宏观的角度来探讨ADO.NET,和大家一起了解ADO.NET来龙去脉以及ADO.NET的主要组成部分 ...
- 分享知识-快乐自己:mysql数据库常见两种引擎
mysql的常用引擎 在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM. 首先: 1.简单介绍这两种引擎,以及该如何去选择. 2.这两种引擎所使用的数据结构是什么. Innod ...
- LINUX CENTOS关机与重启命令详解
Linux centos重启命令: 1.reboot 2.shutdown -r now 立刻重启(root用户使用) 3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.s ...
- 逻辑斯蒂(logistic)回归深入理解、阐述与实现
第一节中说了,logistic 回归和线性回归的区别是:线性回归是根据样本X各个维度的Xi的线性叠加(线性叠加的权重系数wi就是模型的参数)来得到预测值的Y,然后最小化所有的样本预测值Y与真实值y'的 ...
- js操作获取和设置cookie
//创建cookie function setCookie(name, value, expires, path, domain, secure) { var cookieText = encodeU ...