我开发了Excel插件到Visual Studio 2012.Use项目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. Addin已成功部署。在设置中,您可以看到已安装Excel插件但在我的TabControl磁带上不可见。 如果我在磁带出现TabControl时创建一个功能区(可视设计器)而不是功能区(xml)。我该如何解决?
答案 0 :(得分:2)
这可能是因为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");
}
}