【问题标题】:Excel addin. Missing Ribbon (XMl)Excel插件。缺少功能区 (XML)
【发布时间】:2013-04-04 13:20:57
【问题描述】:

我为 Visual Studio 2012 开发了 Excel 插件。使用项目 Excel 2010 插件。在项目中创建了一个 Ribbon (XML):

[ComVisible(true)]
public class PricelistRibbon : Office.IRibbonExtensibility
{
    private Office.IRibbonUI _ribbon;

    public PricelistRibbon()
    {
    }

    public event EventHandler ClickButtonRibben;

    protected virtual void OnClickButtonRibben()
    {
        var handler = ClickButtonRibben;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    #region IRibbonExtensibility Members

    public string GetCustomUI(string ribbonID)
    {
        return GetResourceText("ProcessingPricelist.PricelistRibbon.xml");
    }

    #endregion

    #region Ribbon Callbacks
    //Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1

    public void Ribbon_Load(Office.IRibbonUI ribbonUI)
    {
        _ribbon = ribbonUI;
    }

    public void OnAction(Office.IRibbonControl control)
    {
        OnClickButtonRibben();
    }

    #endregion

    #region Helpers

    private static string GetResourceText(string resourceName)
    {
        Assembly asm = Assembly.GetExecutingAssembly();
        string[] resourceNames = asm.GetManifestResourceNames();
        for (int i = 0; i < resourceNames.Length; ++i)
        {
            if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
            {
                using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                {
                    if (resourceReader != null)
                    {
                        return resourceReader.ReadToEnd();
                    }
                }
            }
        }
        return null;
    }

    #endregion
}

在 ThisAddIn 中使用如下功能区:

public partial class ThisAddIn
{
    private void ThisAddIn_Startup(object sender, EventArgs e)
    {
    }

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

    protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject()
    {
        var pricelistRibbon = new PricelistRibbon();
        pricelistRibbon.ClickButtonRibben += PricelistRibbonOnClickButtonRibben;
        return pricelistRibbon;
    }

    private void PricelistRibbonOnClickButtonRibben(object sender, EventArgs eventArgs)
    {
        var control = sender as Office.IRibbonControl;
        if (control == null) return;
        try
        {
            Application.ScreenUpdating = false;

            switch (control.Id)
            {
                case "customButton1":
                    CreateSpecification();
                    break;
                //..............
            }
        }
        catch (Exception throwedException)
        {
            MessageBox.Show(throwedException.Message, @"Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        finally
        {
            Application.ScreenUpdating = true;
        }
    }

    private void CreateSpecification()
    {
    }

    #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()
    {
        Startup += ThisAddIn_Startup;
        Shutdown += ThisAddIn_Shutdown;
    }

    #endregion
}

接下来我通过 ClickOnce 部署这个插件。已安装 MS Office 2007。已成功部署插件。在设置中,您可以看到 Excel 插件已安装但在我的 TabControl 的磁带上不可见。 如果我在磁带出现 TabControl 时创建了功能区(可视化设计器)而不是功能区(xml)。我该如何解决?

【问题讨论】:

  • 请同时发布您的 Ribbon.xml

标签: c# excel vsto excel-2007 add-in


【解决方案1】:

这可能是因为ribbon.xml 中使用的命名空间在Office 2010 和2007 功能区中不同。 Office 2007 Ribbon.xml 需要类似的命名空间

<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui">

在 2010 年你将不得不使用的地方

<customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2009/07/customui">

建议创建两个ribbon.xml 并在下面的代码中执行类似的操作

protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
       majorVersion = Globals.ThisAddIn.Application.Version.Split(new char[] { '.' })[0];
        if (majorVersion == 12) //office 2007
        {
             return new Ribbon2007();
        }
        else if (majorVersion >= 14) //office 2010
        {
            return new Ribbon2010();
        }


}


[ComVisible(true)]
public class Ribbon2007: Office.IRibbonExtensibility
{
    public string GetCustomUI(string ribbonID)
        {
                    var ribbonXml = GetResourceText("Ribbon2007.xml");                 

    }
}


[ComVisible(true)]
public class Ribbon2007: Office.IRibbonExtensibility
{
    public string GetCustomUI(string ribbonID)
        {
            var ribbonXml = GetResourceText("Ribbon2010.xml");                 

    }
}

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多