分享

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

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


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


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


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




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


        
        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。

 

        窗格做好了,上图就是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、在出现的新窗口里单击“TabAddIns (内置)”选项卡,在属性窗口按图9修改,单击“Group1”组,在属性窗口清空“Label”属性的内容(也可以输入你想要的内容),按图10修改。

 

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


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

       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, 下载次数: 640

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多