ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 37656|回复: 49

【学习VSTO 】—— 制作自定义窗格

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-13 22:17 | 显示全部楼层 |阅读模式
本帖最后由 wpxxsyzx 于 2014-10-5 15:09 编辑

        记不清什么时候了,接触过Kutools,感觉里面的“导航”功能很实用,同时对VSTO也充满了好奇。暑假来了,终于有时间学习VSTO,就从做自定义任务窗格入手吧,读书、上网查阅资料,终于做好了,回味学习制作的过程,深深的感到:不仅仅是自定义功能区,也不仅仅是开发Excel插件,VSTO(VB.NET) 很强大、很方便,比如,由于引入了.Net Framework,有时你只需要声明相关的命名空间,用一两句代码就可以实现在vb6vba中需要编写大量代码才可以实现的功能。


        如果要对Office进行二次开发,VSTO是未来趋势。可惜,关于VSTO的书籍、网上的资料少的可怜,即使能找到的要么泛而全,要么是只言片语,至今没有找到系统详细讲解VSTO的资料。这只是学习VSTO、摸索制作自定义窗格的一个过程,目前还有错误和可以改进的地方,功能也很简单,如果在窗格里添加不同的控件可以实现更复杂的功能。效果图如下
11.gif


        废话有点多了,下面是具体制作步骤,如果接触过VS也许会好些,不同版本,下面的内容将有细微不同(我这里是VS2010)。最后用两种方法制作安装程序,简单介绍vsto的部署功能。


        1、打开VS2010,单击“文件”—“新建项目”,出现图1窗口,窗口左侧依次单击 Visual Basic”和“Office”前的“+”号展开,根据安装office版本的实际情况选择一项(这里选择“2010”),单击窗口中部的下拉列表,选择.NET Framework的版本。项目
类型选择“Excel 2010 外接程序”。修改名称框处项目名字为“任务管理”,单击“浏览”选择保存项目的位置。单击“确定”。



1.jpg 2.JPG

        
        2、如图2,单击“项目”菜单—选择“添加用户控件”。在出现如图3窗口,选择“用户控件”,修改名称为“PaneControl”,单击“添加”。调整刚添加的“PaneControl”控件的大小。

3.jpg 4.JPG

        
        3、移动鼠标到“工具箱”处,如图4。显示工具箱,选择“ListBox”项,移动鼠标到“工具箱”上的隐藏工具箱按钮并单击以隐藏工具箱。在“PaneControl”控件上拖动鼠标添加ListBox1控件(用于显示打开的所有工作薄)。如图5,在属性窗口设置ListBox1控件的“Dock”属性为“Top,Font”属性为“小四”,并适当调整大小。

        重复步骤3依次添加一个“Splitter”控件(展开“所有 Windows 窗体”前+号可找到该控件),在属性窗口设置其“Dock”属性为“Top”、 “Size”属性中的“Height”为5。再添加一个ListBox控件(用于显示活动工作薄中的所有表),设置其“Dock”属性为“Fill” “Font”属性为“小四”,并适当调整大小。(也可以使用Listview控件代替ListBox控件,再配合ImageList控件,这样可以让列表中的每一项都带上图标,视觉效果更好)最终效果如图6。

5.JPG 6.jpg

        窗格做好了,上图就是excel里要显示的窗格的样子,但仅仅是一个没有任何功能界面。下面添加相应的代码让窗格实现一定的功能。

        4、单击项目—选择“添加模块”—在出现的窗口里选择“模块”项,单击“添加”。添加如下代码:


Module Module1
    Public XlApp As Excel.Application
    Public bOpen As Boolean
End Module


        为了能把打开的工作薄添加到ListBox1,判断哪个是活动工作薄,并且把活动工作薄对应的项选中。在“解决方案资源管理器”里右击“PaneControl.vb”—选择“查看代码”,添加以下过程(代码添加到Public Class PaneControl和End Class之间,后面其他模块里添加代码也是如此):


Public Sub FillBook()
Dim Wb As Microsoft.Office.Interop.Excel.Workbook
With ListBox1
.Items.Clear()
For Each Wb In XlApp.Workbooks
If bOpen Then
If Wb.Name <> "工作簿1" And Wb.Name <> "Book1" Then .Items.Add(Wb.Name)
            Else
.Items.Add(Wb.Name)
End If
Next
If .Items.Count = 0 Then
         .SelectedIndex = -1
         Else
         For i = 0 To .Items.Count - 1
                  If XlApp.ActiveWorkbook.Name = .Items(i) Then
                  .SelectedIndex = i
                      Exit For
                  End If
             Next
         End If

End With
bOpen=False
End Sub


        为了能把活动工作薄的表(ListBox1当前选中的项对应的工作薄)添加到ListBox2,判断哪个是活动工作表,并且把活动工作表对应的项选中。添加以下过程:


Public Sub FillSheet()
Dim Ws As Object
With ListBox2
.Items.Clear()
For Each Ws In XlApp.Workbooks(ListBox1.Text).Sheets
.Items.Add(Ws.Name)
Next
For i = 0 To .Items.Count - 1
If XlApp.ActiveSheet.Name = .Items(i) Then
.SelectedIndex = i
    Exit For
End If
Next
End With
End Sub


        5、添加如下两个过程,第一个过程用于在窗格里单击不同工作薄时,在excel界面激活并显示该工作薄的内容,然后在ListBox2中显示该工作薄的所有表。第二个过程用于在窗格里单击不同工作表时,在excel界面激活并显示该工作表的内容。


Private Sub ListBox1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.Click
XlApp.Workbooks(ListBox1.Text).Activate()
Call FillSheet()
End Sub

Private Sub ListBox2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox2.Click
XlApp.Workbooks(ListBox1.Text).Sheets(ListBox2.Text).Activate()
End Sub


        在窗格加载时连接正在使用的excel应用程序对象,并填充列表框

Private Sub PaneControl_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
XlApp = Globals.ThisAddIn.Application  
Call FillBook()
Call FillSheet()
End Sub


        6、单击项目—选择“添加新项”,出现如图7窗口,选择“Office”项,选择“功能区(可视化编辑器)”项,修改名称为“PaneRibbon”,单击“添加”。(如果选择“功能区 (XML)”选项,编写XML代码也可以实现上面功能区。)

7.JPG 8.JPG
        7、在出现的新窗口里单击“TabAddIns (内置)”选项卡,在属性窗口按图9修改,单击“Group1”组,在属性窗口清空“Label”属性的内容(也可以输入你想要的内容),按图10修改。

9.JPG 10.JPG

重复步骤3在组内添加一个“ToggleButton”控件(展开“Office 功能区控件”前+号可找到该控件),设置其“ControlSize”属性为“RibbonControlSizeLarge”,设置其“Label”属性为“任务管理”,设置其“Image”属性,出现如图11窗口,选择“本地资源”—“导入”—选择准备好的文件(最好使用PNG格式的文件)—单击“确定”。最终效果如图8。

11.JPG

        至此功能区也做好了,下面添加代码实现一定的功能

       9、在“解决方案资源管理器”里双击“ThisAddIn.vb”,在模块顶部声明区添加如下声明:


Private MyControl As PaneControl
Private WithEvents FilePane As Microsoft.Office.Tools.CustomTaskPane


        在插件加载时设置窗格并调整位置,卸载时清空。添加如下代码:
Private Sub ThisAddIn_Startup() Handles Me.Startup
        MyControl = New PaneControl()
        FilePane = Me.CustomTaskPanes.Add(MyControl, "任务管理")
        FilePane.DockPosition = Microsoft.Office.Core.MsoCTPDockPosition.msoCTPDockPositionLeft
End Sub


Private Sub ThisAddIn_Shutdown() Handles Me.Shutdown
        MyControl = Nothing
        FilePane = Nothing
End Sub


        窗格显示状态改变时功能区按钮的状态应随着变化,例如,单击任务窗格上的关闭按钮,功能区的按钮状态应该变为未选中状态。添加如下代码:
Private Sub FilePane_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles FilePane.VisibleChanged
        Globals.Ribbons.PaneRibbon.ToggleButton1.Checked = FilePane.Visible
End Sub


Public ReadOnly Property TaskPane() As Microsoft.Office.Tools.CustomTaskPane
        Get
            Return FilePane
        End Get
End Property


        当我们在excel界面选择不同工作薄和工作表时应该在窗格里的两个列表框里选中活动工作薄和活动工作表对应的项。同样的道理。打开、新建、关闭工作薄,新建、删除工作表时应该实时更新窗格里的列表框,并且选中对应的项,所以添加如下代码:

Private Sub Application_SheetActivate(ByVal Sh As Object) Handles Application.SheetActivate
        Call MyControl.FillSheet()
End Sub


Private Sub Application_WorkbookActivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookActivate
        Call MyControl.FillBook()
        Call MyControl.FillSheet()
End Sub

        当只有一个工作薄时,再关闭工作薄应该清空列表框
Private Sub Application_WorkbookDeactivate(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookDeactivate
        If XlApp.Workbooks.Count = 1 Then
            MyControl.ListBox1.Items.Clear()
            MyControl.ListBox2.Items.Clear()
        End If
End Sub


        打开excel时会默认新建一个工作薄,如果继续打开其他工作薄,默认新建的工作薄会消失,因此在xlApp_WorkbookOpen事件里利用bOpen全局变量(已经在模块里声明)配合“PaneRibbon.vb”里的Public Sub FillBook过程来实现打开工作薄时在窗格列表里清除默认新建的工作薄对应的项


Private Sub Application_WorkbookOpen(ByVal Wb As Microsoft.Office.Interop.Excel.Workbook) Handles Application.WorkbookOpen
        bOpen = True
End Sub


        9、单击功能区上我们添加的ToggleButton按钮应该控制窗格显示或隐藏,在“解决方案资源管理器”里右击“PaneRibbon.vb”—选择“查看代码”,添加如下代码:


Private Sub ToggleButton1_Click(ByVal sender As System.Object, ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles ToggleButton1.Click
    Globals.ThisAddIn.TaskPane.Visible = _
TryCast(sender, Microsoft.Office.Tools.Ribbon.RibbonToggleButton).Checked
End Sub


        10、保存项目,单击“生成”—选择“生成 任务管理”,打开excel可以看到效果。再次单击“生成”—选择“发布 任务管理”,在出现的窗口里单击“浏览”,选择保存位置,单击“完成”,生成的文件可以安装,在控制面板中可以卸载。(计算机上必须要安装有.net framework 4.0),保存项目。


        上面的安装程序制作是简单方法,是部署功能的简化,采用部署功能制作安装程序更正规一些。由于vs的部署牵扯的东西较多,比如安全,版本等,是一个很复杂的功能,下面只是简单演示如何制作加载项的安装程序。先上安装程序,稍后上源码。

安装.rar

247.29 KB, 下载次数: 814

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-13 22:18 | 显示全部楼层
本帖最后由 wpxxsyzx 于 2012-7-16 08:43 编辑

部署程序的简单简单介绍
        11、打开项目“任务管理”,单击“文件”—“新建项目”,出现如图12窗口,窗口左侧依次单击 “其他项目类型”和“安装和部署”前的“+”号展开,选择“Visual Studio Installer”,右侧项目类型里选择“安装项目”。在名称框处修改项目名字为“部署”,单击“浏览”选择保存项目的位置。“解决方案”选择“添加到解决方案”,单击“确定”,出现图13窗口。

12.JPG


如图13,单击“应用程序文件夹”,在右侧属性窗口修改“DefaultLocation”属性为“[ProgramFilesFolder] \[ProductName]”,即删除其中的“[Manufacturer]”,这样可以避免安装程序的默认目录里含有你的用户名。你可以不做此步查看区别。

13.jpg

        如图13,在“解决方案资源管理器”里右击刚添加的项目“部署”—“添加”—“项目输出(p)”,
在出现的窗口里,下拉框处选择“任务管理”,列表框处选择“主输出”项,单击“确定”。
        如图13,再次右击“部署”—“添加”—“文件”,在出现的窗口里浏览选择添加 “任务管理.dll.mainfest”文件。重复上述步骤在把和文件“任务管理.vsto”也添加进来。(文件在“项目名\项目名\bin\debug”文件夹下,比如我的在“g:\任务管理\任务管理\bin\debug文件夹下)
        如图13,再次右击“部署”—“属性”—在出现的新窗口里单击“系统必备(P)”按钮,出现如图14窗口,根据情况勾选.net frameworkwindows installer项,在“指定系统必备组件的安装位置”处选择一项,此步骤用于让安装程序检查运行加载项必须的环境,如果希望安装时从微软网站下载,选择第一项;如果希望直接把再发行包打包到安装程序中,则选择第2项,这样在debug文件夹下会自动下载并生成“DotNetFX40Client WindowsInstaller3_1”文件夹,里面有应用程序需要的安装程序。单击“确定”,单击“应用”—“确定”。

14.JPG


        此种安装程序需要修改注册表,下面在安装程序里设置注册表项(需要一点注册表知识,不详细说了)“解决方案资源管理器”里再次右击“部署”—“视图”— “注册表”,出现如图15窗口,依次展开“HKEY_CURRENT_USER”和“Software”前的加号,右击键“[Manuffactuere]”—选择“重命名”—修改键名为“Microsoft”,右击“Microsoft”键—“新建”—“键”—修改键名为 Office”。依次建立“Excel”、“Addins”、“任务管理”几个子键。

15.JPG

在键“任务管理”上右击—“新建”—“字符串值”(或者DWORD 值),依次为项目中的键“任务管理”建立“Description”、“FriendlyName”、“LoadBehavior”、“Manifest”这四个项,(注意键的类型),每建立一个项,在右侧属性窗口设置其“Value”属性。前两项的“value”属性值为“任务管理,后两项“value”属性值参照图16、图17设置。最终的结果如图18

16.JPG
17.JPG

18.JPG


单击“生成”—“生成 部署”即可生成安装程序,位置在“插件项目名\部署项目名\debug”文件夹下。如我的在“任务管理\部署\debug”文件夹下。

任务管理.part2.rar

476.3 KB, 下载次数: 500

任务管理.part1.rar

900 KB, 下载次数: 569

TA的精华主题

TA的得分主题

发表于 2012-7-13 23:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-14 09:51 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-14 12:16 | 显示全部楼层
vb6也可以做,这个VSTO的容易一些,不过这里面也有一个特殊情况,会出现加载错误,这个以前我也考虑过,不过也没有想到完美的方法。就是打开工作簿时的那个问题

TA的精华主题

TA的得分主题

发表于 2012-7-14 12:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-14 12:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wpxxsyzx 于 2012-7-16 11:24 编辑
xtanuihazfh 发表于 2012-7-14 12:25
这个貌似我去年就发过帖的,VSTO与VB6的都有
http://club.excelhome.net/thread-729365-1-1.html
http://c ...


是的,你发过。我是看到kutools的导航,感兴趣,试一下。
花时间看了你的贴,我觉得和我这个是两码事:
1、你是直接显示,就不牵扯自定义功能区。我是使用功能区设计器在内置选项卡上添加按钮控制窗格显示。

2、由于存在功能区,就需要添加代码,让按钮状态和窗格显示与否关联,实时更新,解决用窗格关闭按钮关闭窗格,恢复功能区按钮状态。

3、打开excel会默认建立一个空工作薄,再打开其他工作薄时,这个默认的工作薄应从列表中消失,否则单击此文件会出错,你没有解决这个问题。同样,关闭所有工作薄时应该清空列表你也没解决。

4、插入、删除表时你没有更新列表,如果插入非worksheet类型的表会悲剧。

5、在excel界面单击不同工作表,你没有更新列表框的选中状态。在任务栏单击不同工作薄,会有声音报警,我也没有解决。

6、发布应用程序只是部署的简化,采用部署制作安装程序更正规些。我的帖最后介绍了部署应用程序,部署也是一个很麻烦的事。

学vsto的人少,因为资料少。公布源码,研究的人多了,资料就多了,人多力量大。

TA的精华主题

TA的得分主题

发表于 2012-7-14 12:48 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xiaoqiu88 于 2012-7-14 12:50 编辑
xtanuihazfh 发表于 2012-7-14 12:25
这个貌似我去年就发过帖的,VSTO与VB6的都有
http://club.excelhome.net/thread-729365-1-1
http://c ...


这个不错!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-14 12:53 | 显示全部楼层
本帖最后由 wpxxsyzx 于 2012-7-16 11:21 编辑
xtanuihazfh 发表于 2012-7-14 12:25
这个貌似我去年就发过帖的,VSTO与VB6的都有
http://club.excelhome.net/thread-729365-1-1.html
http://c ...


我是用功能区可视化设计器加到开始选项卡的,有错误但不妨碍使用,求解

TA的精华主题

TA的得分主题

发表于 2012-7-14 14:22 | 显示全部楼层
用什么工具不重要,重要的是你怎么用好自己的工具。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 10:28 , Processed in 0.062379 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表