VSTO学习之路:文档级项目的任务窗格

引言:下图类似“剪帖画”的是几个Excel中的命令栏其中“文档操作”是可自由定制的,文档操作面板无法直接使用(不可见),在本图里可以看到,是因为我写代码在上面添加了一个TextBox控件。

命令栏是Commandbars集合成员,属于Commandbar类型。使用VBA写段代码罗列出所有的命令栏:

 1 Sub ShowCommandbar()
 2 Dim bars As Office.CommandBars
 3    Set bars = Application.CommandBars
 4 Dim bar As Office.CommandBar
 5 For Each bar In bars
 6     i = i + 1
 7     Cells(i, 1) = bar.Name           ‘名称
 8     Cells(i, 2) = bar.NameLocal      ‘本地化名称
 9     Cells(i, 3) = bar.Index          ‘索引
10 Next
11 End Sub

其中和上几个命令栏有对应关系的摘录如下。

Task Pane是要定制的目标,无法直接给它添加我们想要的控件,但可以把控件添加在ActionsPane对象上。

关系示意图:

这个关系模型意味着:要添加控件就要找ActionsPane,要控制这些元素整体在工作表上的位置就要依赖Task Pane。

没错,一定要记住Task Pane就是一个命令栏(Commanbar)。不过要给这个命令栏添加控件,就要借道ActionsPane。

1  public sealed partial class ThisWorkbook : Microsoft.Office.Tools.Excel.WorkbookBase {
2         internal Microsoft.Office.Tools.ActionsPane ActionsPane;
3         //省略部分代码
4         private void InitializeControls() {
5             this.ActionsPane = Globals.Factory.CreateActionsPane(null, null, "ActionsPane", "ActionsPane", this);
6         }
7         //省略部分代码
8 }

ActionsPane对象定义在ThisWorkbook.Designer.cs中,在Thisworkbook类里可以直接调用:

 1 using Office = Microsoft.Office.Core;
 2
 3 private void ThisWorkbook_Startup(object sender, System.EventArgs e)
 4 {
 5      //给ActionsPane添加控件(添加控件后,任务窗格在工作簿打开时就会默认显示出来)
 6     TextBox box=new TextBox() ;
 7     ActionsPane.Controls.Add(box );
 8      //取消停靠
 9     box.Dock = DockStyle.None;
10      //设置锚定
11     box.Anchor = AnchorStyles.Top;
12      //文本框的宽度
13     box.Width = 100;
14      //设置Task Pane的显示位置
15     Office.CommandBar bar = Globals.ThisWorkbook.Application.CommandBars[125];
16     bar.Position = Office.MsoBarPosition.msoBarLeft;
17 }

使用编程方式可以动态的给ActionsPane添加控件,但有时也需要使用设计好的图面,ActionsPane没有设计图面,此时可以借用ActionsPaneControl或者UserControl,其中后者还可以充当程序级项目操作窗格的设计器。

右键点解决方案,添加用户控件:

UserContrl是控件容器,将控件拖动到设计图面上:

然后使用代码,将控件添加到ActionsPane即完成任务窗格的定制:

1  private void ThisWorkbook_Startup(object sender, System.EventArgs e)
2 {
3      //给ActionsPane添加控件
4     ActionsPane.Controls.Add(new UserControl1());
5      //添加控件后,可见性自动为true,下面一句是不需要的
6     //ActionsPane.Visible = true;
7 }

工作簿启动后,在视图选项卡中可以找到“文档操作”按钮,控制其显示和隐藏(默认情况下工作簿该按钮不可见)。

最后要指出个人的理解(不确定是否正确):

      文档级任务窗格是"单例"的——即任何时候拿到的都是同一个任务窗格。即使可以动态的给它添加或减少控件,即使可以根据需要让窗格中控件可见或不可见。但这些所有操作的对象,都是同一个Task Pane,同一个Commandbar上的同一个ActionsPane。

这一点和程序级Addin项目中的任务窗格是不同的。

    

时间: 2024-10-06 05:41:16

VSTO学习之路:文档级项目的任务窗格的相关文章

新手学习之路01-创建项目开始

新手学习之路01-创建项目开始 小菜鸟准备学习RN开发,决定写下自己的学习历程,方便其他也想要学习RN的人,后期会持续更新写下自己所有学习经历,一步步从菜鸟成长成业内高手.开发环境准备,本文默认环境已经装好,或者参考下面URL搭建环境.本章源码和文档请参考文章末尾 windows环境搭建 mac环境搭建参考 配置VPN或者请将npm仓库源替换为国内镜像 npm config set registry https://registry.npm.taobao.orgnpm config set di

VSTO学习之路:使用CustomXMLPart存储数据

假设两种情形: 1.当有一些数据要使用,但不想让用户直接看到,常规的方式是放在一个表里,然后隐藏 2.当数据来自服务器.远端服务器,但文档要带到一个离线环境使用 此时可以考虑在工作簿中创建一个CustomXMLPart,要创建它非常简单,可以使用CustomXMLParts接口的Add方法创建CustomXMLPart,CustomXMLPart接口和CustomXMLParts接口定义在 using Microsoft.Office.Core; 命名空间下,其中CustomXMLPart的定义

VSTO学习之路:学习使用Epplus(1)

关于读取其它工作簿数据的几个方式的比较: 1.VBA的GetObject方法,会调用Excel程序打开工作簿(虽然不可见,但确实是打开的) 2.SQL,使用繁琐缺少灵活,不支持单元格样式的操作,也似乎不支持delete语句删除源数据. 3.使用Open XML SDK,基于Open XML,不依赖于Excel程序,但步骤繁琐. 4.Epplus,基于OpenXML,简单灵活,不依赖Excel程序打开工作簿,处理数据的速度快. 下载:Epplus,引用Epplus,然后  using Office

VSTO学习之路:使用Open XML SDK for Office解析Excel数据

Excel2007以后,工作簿是以XML文本保存数据的,用压缩工具打开工作簿文件,结构大致如下: 文件夹下基本全部是xml文本文件.微软提供了Open XML SDK 2.5 for Office,其中定义了和这些xml文件相关的类,帮助我们使用xml的形式解析工作簿里的数据和内容.跳转到微软官方资料          跳转到Open XML SDK 2.5 for Microsoft Office下载连接 在安装了 Open XML SDK 2.5 之后,在项目或应用程序中,添加对以下组件的引

Linux命令学习之路-文档浏览之less

使用权限:所有角色 使用方式:less [ options ] filename 作用:文档内容浏览,可向前或者向后浏览文档内容 注意点: 1.less 命令和 more 命令的作用大致相同,less 命令允许用户向前或者向后浏览文档内容,而 more 命令只允许用户向前浏览文档内容 2.less 命令并不是在一开始就读入整个文档,因此在打开大型文档时比一般文本编辑器要快 3.filename 表示要读入的文档的名称 关键点: 1.-e : 文件内容显示完毕后,自动退出 2.-f : 强制加载整

VUE学习之路一环境/项目创建

vue环境安装 nodejs 需要配置环境变量 脚手架安装工具 npm install --global vue-cli / cnpm install --global vue-cli //安装cnpm命令时需要配置淘宝镜像 创建项目 创建的位置必须要先CD到相应的目录下 cli2.X    创建: vue init webpack project-name     运行:npm run dev cli3.x    vue create webpack project-name npm run

VSTO学习之路:ListObject控件的复杂数据绑定初步

先做两个准备:一个实体类 +  一个集合            目标:把集合绑定到宿主控件(主要演示编程方式做绑定). public class Person { public string Name { get; set; } public int Age { get; set; } public char Gender { get; set; } } 1 public List<Person> PersonList() 2 { 3 List<Person> persons =

VSTO学习之路:学习使用Epplus——读写VBA代码

创建xlsm工作簿: 宏工作簿,必须有VBProject对象,至少要有一个工作表 1 string path = @"E:\studyvs\open xml\test.xlsm"; 2 var package = new ExcelPackage(); 3 package.Workbook.Worksheets.Add("Sheet1"); 4 //创建工程对象 5 package.Workbook.CreateVBAProject(); 6 //保存工作簿 7 p

VSTO学习笔记(一)VSTO概述

原文:VSTO学习笔记(一)VSTO概述 接触VSTO纯属偶然,前段时间因为忙于一个项目,在客户端Excel中制作一个插件,从远程服务器端(SharePoint Excel Services)上下载Excel到本地打开,用户编辑后再上传回服务器端.当时工期紧迫,临时查了些资料,用VSTO + Excel COM API完成.正因为这个项目,我发现了VSTO的强大功能与潜力,决定抽出一些时间来好好研究下. 示例代码下载 本系列所有示例代码均在 Visual Studio 2010 Beta 2 +