Excel自定义任务窗格未显示

时间:2014-07-04 15:50:52

标签: excel vsto excel-2013 excel-addins customtaskpane

我在excel VSTO加载项中显示自定义任务窗格,我正在构建它并将其显示为:

var ctrl = new CellTaskPane();
var pane = CustomTaskPanes.Add(ctrl, "Custom Sheet");
pane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
pane.DockPositionRestrict = Office.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
pane.Visible = true;

这是在ThisAddin.cs文件中完成的,它在我的机器上工作得很好,无论是在Debug会话下还是通过click-once安装程序安装的加载项。

但是,在同事的机器上安装插件会很麻烦。

加载项正常运行,上下文菜单/功能区工作正常,但窗格只是拒绝显示。

我在功能区上有一个切换按钮,用于切换窗格中的Visible属性,甚至点击该按钮也不会强制窗格显示。

对此的任何帮助都将非常感激,谷歌对此毫无用处。

感谢。


我应该提一下,根据MSDN上的文档,CellTaskPane只是UserControlhttp://msdn.microsoft.com/en-us/library/aa942846.aspx

10 个答案:

答案 0 :(得分:3)

我建议您先尝试一个非常非常简单的自定义任务窗格,看看是否有效。我把我能想到的最简单的例子放在一起,基本上是一个单独的文本框,它会将一个值推入其中,并在按下按钮时返回到功能区。

如果你试试这个,那么我会把它作为一个新的解决方案。使用" Designer模式创建一个新的VSTO项目"带。添加一个切换按钮和它下面的普通按钮。然后复制以下代码:

ThisAddIn.cs

using System;
using Office = Microsoft.Office.Core;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private Microsoft.Office.Tools.CustomTaskPane pane;
        private CellTaskPane ctrl = new CellTaskPane();

        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            pane = CustomTaskPanes.Add(ctrl, "Custom Sheet");
            pane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
            pane.DockPositionRestrict = Office.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
            pane.Visible = true;
            pane.VisibleChanged += new EventHandler(taskPaneValue_VisibleChanged);
            ctrl.SetName("test");
        }

        private void taskPaneValue_VisibleChanged(object sender, System.EventArgs e)
        {
            Globals.Ribbons.Ribbon1.toggleButton1.Checked = pane.Visible;
        }

        public Microsoft.Office.Tools.CustomTaskPane TaskPane
        {
            get
            {
                return pane;
            }
        }

        public CellTaskPane MyContainer
        {
            get
            {
                return ctrl;
            }
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}

添加一个名为CellTask​​Pane.cs的新类:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace ExcelAddIn1
{
    public class CellTaskPane : System.Windows.Forms.UserControl
    {
        public System.Windows.Forms.TextBox test;

        public CellTaskPane()
        {
            InitializeComponent();
        }

        public void InitializeComponent()
        {
            test = new System.Windows.Forms.TextBox();
            test.Location = new System.Drawing.Point(120, 8);
            test.Size = new System.Drawing.Size(232, 20);
            test.TabIndex = 0;
            Controls.AddRange(new System.Windows.Forms.Control[] { test });
            Size = new System.Drawing.Size(375, 150);
        }

        public void SetName(string text)
        {
            test.Text = text;
        }

        public string GetName()
        {
            return test.Text;
        }
    }
}

将以下代码添加到Ribbon1.cs:

using System;
using Microsoft.Office.Tools.Ribbon;

namespace ExcelAddIn1
{
    public partial class Ribbon1
    {
        private void toggleButton1_Click(object sender, RibbonControlEventArgs e)
        {
            Globals.ThisAddIn.TaskPane.Visible = ((RibbonToggleButton)sender).Checked;
        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            button1.Label = Globals.ThisAddIn.MyContainer.GetName();
        }
    }
}

显然你需要做一些调整才能使它工作,我试图采用新项目和按钮的默认名称。

运行此操作时,您应该获得自定义任务窗格。当你切换到&#34; TabAddIn&#34;然后单击切换按钮,它应显示/隐藏任务窗格。单击常规按钮时,应将任务窗格中唯一字段的内容复制为按钮名称。我将此默认为&#34; test&#34;,所以即使任务窗格不可见,您也可以看到它是否在内存中?

我对此进行了测试,看起来效果很好。基本上这只是MSDN上的示例的一个被黑客攻击的版本。如果你想要你可能自己也可以这样做吗?如果没有别的,这将使您能够看到正在处理的更复杂的功能区中是否存在导致问题的任何内容......或者如果这是您同事的机器的基本问题。

答案 1 :(得分:3)

原来我们没有直接做的事情!

安装了另一个加载项(第三方),由于某些奇怪的原因干扰了正在显示的窗格(不知道为什么或如何)。

遗憾的是Excel没有显示任何类型的错误或者至少抛出异常。

好啊。

答案 2 :(得分:3)

我有同样的问题,但它不是我可以禁用的任何插件(COM +或Excel)。

我将excel配置为在启动时打开文件 (Excel选项 - &gt;高级 - &gt;常规)

enter image description here

在那里,我有一个自定义功能区的.XLAM。 当我清除此配置时,我的插件开始工作。

答案 3 :(得分:2)

我在尝试获取Microsoft示例代码时遇到了这个问题&#34;演练:使用功能区按钮同步自定义任务窗格&#34;工作。这是指向该页面的链接:

http://msdn.microsoft.com/en-us/library/bb608590.aspx

从头开始大约三次并在互联网上搜索我可能做错了什么的线索,我遇到了这个问题和Clint的回答,一个加载项引起了他的问题。我启用了一些加载项,但经过一些试验和错误,我找到了罪魁祸首:微软自己的&#34;分析工具包&#34;!

禁用Analysis Toolpack后,自定义窗格会按预期显示并消失。

因此,正如Clint发现的那样,如果遇到这个问题,你应该尝试的第一件事就是禁用所有加载项,看看是否可以解决这个问题。如果是这样,那么您可以返回并开始打开它们,直到找到干扰自定义窗格可见性的那个。

答案 4 :(得分:1)

好吧,按照@ GaryP的建议,禁用我的其他加载项,思考我解决了问题(虽然没有访问我的其他加载项),我发现只要我打开多个工作簿,加载项就会消失。

但在那时,我并没有得到一个丢失的任务窗格或一个无声的失败,我实际上遇到了一个错误:

  

任务窗格已被删除或不再有效

因此,似乎禁用加载项本身并不能解决问题,而是禁用加载项会减少打开的工作簿数量(即使加载项不可见,它们也可以还有一个Ribbon句柄...)

根本原因是使用SDI in 2013 and later

所以,现在我可以加载所有加载项了。

答案 5 :(得分:0)

我遇到了同样的问题并且没有通过禁用分析工具包来修复它,但是,我不得不将XLAM从其已安装的文件夹中移出(打破对它的引用,因为你无法解决它通过Excel删除它,它开始工作。

我意识到将文件添加回来并继续工作。激活插件会导致我的自定义任务栏中断。不确定这个长期定位是什么。

答案 6 :(得分:0)

为每个工作簿创建任务窗格的新实例。对代码进行以下更改,即使启用了插件,任务窗格也能正常工作。

private void Application_WorkbookActivate(Microsoft.Office.Interop.Excel.Workbook wb)
{
    pane = CustomTaskPanes.Add(ctrl, "Custom Sheet");
    pane.DockPosition = Office.MsoCTPDockPosition.msoCTPDockPositionRight;
    pane.DockPositionRestrict = Office.MsoCTPDockPositionRestrict.msoCTPDockPositionRestrictNoChange;
    pane.Visible = true;
    pane.VisibleChanged += new EventHandler(taskPaneValue_VisibleChanged);
    ctrl.SetName("test");
}

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(
        Application_WorkbookActivate);
}

答案 7 :(得分:0)

如果您发现即使关闭了所有其他加载项,TaskPane仍然没有显示,可能是因为它已加载到“ Personal.xlsb”工作簿中。关闭它之后,我尝试再次使该窗格可见,并且收到一个错误消息,指出它已被关闭。

答案 8 :(得分:0)

我知道这很旧,但它对任何可能寻找答案的人都有用,但我们继续: 如果您在 ThisAddIn_Startup 下添加新任务窗格,它只会在 excel 开始时添加一次,并且不会出现在任何其他 Excel 会话中,因此基于以下显示如何处理多个会话的链接:< /p>

https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/bb264456(v=office.12)?redirectedfrom=MSDN#Anchor_2

我得出的结论是我应该在需要任务窗格时可以触发的其他事件下创建一个新的任务窗格,然后验证当前窗口是否有任务窗格,如果没有则创建一个新的并显示它。事件可以是任何触发器,如功能区按钮、打开文档等。

Dim CurrentTaskPane As Microsoft.Office.Tools.CustomTaskPane = Nothing
Globals.ThisAddIn.RemoveOrphanedTaskPanes() 'to remove any unused taskpane
For Each ctp As Microsoft.Office.Tools.CustomTaskPane In Globals.ThisAddIn.CustomTaskPanes
    If ctp.Window.Hwnd = Excel.Application.ActiveWindow.Hwnd Then
       CurrentTaskPane = ctp
       Exit For
    End If
Next
If CurrentTaskPane Is Nothing Then
    CurrentTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(New ControlName, "My TaskPane", Excel.Application.ActiveWindow)
End If
CurrentTaskPane.Visible = True

您可以从提供的链接中找到“RemoveOrphanedTaskPanes”代码。

答案 9 :(得分:-1)

总结其他答案:这似乎是由于加载其他加载项,.XLAM文件等。这些可以从许多不同的地方加载,您需要检查所有,并删除它们。您可以稍后重新启用它们,以便备份所有内容。这是一份清单:

  1. 文件 - &gt;选项 - &gt;高级 - &gt;一般 - &gt; &#34;启动时,打开...&#34;中的所有文件。删除这些文件并禁用该选项。
  2. 文件 - &gt;选项 - &gt;加载项 - &gt;检查所有活动应用程序加载项。在对话框底部附近,使用Mange:Excel / Com加载项查看加载项并禁用或删除它们。即使是微软收录的也可能导致它,所以也禁用它们。他们不允许你删除它们,只要禁用它们就没问题。
  3. C:\Users\$USERNAME\AppData\Roaming\Microsoft\Excel\XLSTART删除此目录中的所有文件。
  4. C:\Users\$USERNAME\AppData\Roaming\Microsoft\AddIns删除此目录中的所有文件。
  5. 在此之后,再次尝试加载加载项。然后,逐个添加您需要的东西并继续测试。他们可能会再次破坏它,或者不会,对于什么类型的加载项不会破坏任务窗格似乎没有达成共识。

    如果有人发现了更多地方要查找加载项,我会将它们添加到列表中。