Excel开发学习笔记:界面交互与控件的布局

除了业务逻辑之外,比较耗时耗力的就是人机交互了。在编写excel定制程序的过程中,这次用到了以下几种交互方式:

  1. 通过excel工作表(worksheet)获取用户输入
  2. 通过按钮控件触发功能代码执行
  3. 通过TreeView控件显示内容摘要及导航
  4. 通过自定义的windows窗体提供交互

工作表的操作放到后面再说,讲一下按钮控件button和Treeview控件的布局。

放置控件的方法

无非可视化放置和运行时代码加载两种。可视化放置比较直观,通过visual studio的toolbox工具栏拖动需要的控件到工作表上或者自定义的windows窗体上,然后可以在设计界面设置控件的各种参数,在程序启动时自 动加载。代码加载则需要去msdn上查找各种控件开放的API接口,然后写代码调用API,在程序运行时由这些代码完成加载和参数设置。

控件的布局:

常见的有以下几种位置可供选择,适用于不同情况。

  1. excel worksheet上
  2. 操作窗格action pane(文档级自定义程序专用)
  3. 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(2, 1).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

效果图:

时间: 01-18

Excel开发学习笔记:界面交互与控件的布局的相关文章

Excel开发学习笔记:文件选择控件、查找匹配项、单元格格式及数据有效性

遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. Private OpenFileDialog1 As New OpenFileDialog  Private Sub test()      OpenFileDialog1.Filter 

&lt;WP8开发学习笔记&gt;修改panorama全景控件的标题的大小

panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phone:Panorama Title="我的应用程序" FontSize="30"> <phone:Panorama.Background> <ImageBrush ImageSource="/PanoramaApp3;component/

Silverlight项目笔记1:UI控件与布局、MVVM、数据绑定、await/async、Linq查询、WCF RIA Services、序列化、委托与事件

最近从技术支持转到开发岗,做Silverlight部分的开发,用的Prism+MVVM,框架由同事搭好,目前做的主要是功能实现,用到了一些东西,侧重于如何使用,总结如下:   1.UI控件与布局     2.MVVM     3.数据绑定     4.await/async     5.Linq查询     6.WCF RIA Services     7.序列化     8.委托与事件 1.UI控件与布局 常用的主要是Grid.StackPanel.Border,其中最常用的的是Grid,是一

Excel开发学习笔记:新建文档级的excel解决方案

工作中遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VSTO(没有用VBA),具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. Excel的开发方式有很多,比如VBA.vsto下的文档级程序.vsto下的插件程序等,VBA和文档级程序比较容易上手,开发简单的功能足够了,适合

Excel开发学习笔记:发布VSTO下的Excel开发项目

工作中遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学Excel开发一边动手实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VSTO(没有用VBA),具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 因为是自用的小工具,对部署的要求很低,有个安装文件即可,也不要求兼容老版本的office.这样最简单的就是使用vs2010的pu

IOS 开发学习笔记-基础 UI(10)九宫格布局,块动画,字典转模型,Xib使用

大概如下图示:九个应用图标的样子 功能分析 (1)以九宫格的形式展示应用信息 (2)点击下载按钮后,做出相应的操作 步骤分析 (1)加载应用信息 (2)根据应用的个数创建对应的view (3)监听下载按钮点击 思路整理 要在支持文件夹里,放入 plist 文件,且拖拽素材到 supporting files,注意勾选的项目的区别: 大多数情况,往项目中拖拽素材时,通常选择 Destination, Folders:选择第一项:创建组,这样 xcode 导航显式的是黄色文件夹,要知道,Xcode中

Excel开发学习笔记:VB.net的一些杂项

最近遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 动态数组vb自带的简单数组增删元素和改变大小不方便,.net提供的List类型很好用.比如下面定义了int类型的动态数组,第二句则是将 List(T) 的元素复制到

Excel开发学习笔记:查找与创建worksheet

开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 如题,我在ThisWorkbook.vb中添加了一个public函数来完成查找功能. 入参:待查找的sheet名称 返回:如果存在则返回worksheet对象,如果不存在则返回nothing Public Function WorksheetExist(name As String) As Excel.Worksheet          Try           

Excel开发学习笔记:读取xml文件及csv文件

读取xml文件 有好多种读取xml的方式,xmlDOM比较常见,我使用了另外一种,它以数据流的方式打开文件并读取内容 Imports System.Xml  Dim group As New List(Of String)  Using reader As XmlReader = XmlReader.Create(OpenFileDialog2.FileName)      While reader.ReadToFollowing("group")          reader.Mo