VSTO Excel Com添加function区不加载

我正在使用VS 2010开发Excel 2007 COM加载项。 因为它是VS 2010 Office Project,所以它的目标是.NET 4.0客户端框架。 我添加了一个名为MyRibbon的新function区(XML)项目,因此默认文件名为ThisAddIn.cs,MyRibbon.cs和MyRibbon.xml。

一切都很好。 它以.vsto扩展名发布。 当我安装加载项(通过提供的Setup.exe)时,它将在Excel中安装,并在COM加载项列表中进行检查。 它也被指定在启动时加载。 但是,首先打开Excel或打开Excel文件不会将该选项卡添加到function区。

我可以告诉加载项加载,因为它将“COM加载项加载”在第一个工作表的第一个单元格中。 看起来好像CreateRibbonExtensibilityObject()没有被调用。

有没有人有任何想法,或可以告诉我如何显示任何可能被埋葬的错误消息?

下面的细节。

我已经添加了CreateRibbonExtensibilityObject()的覆盖:

protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new MyRibbon(); } 

MyRibbon.xml看起来像这样,一个选项卡内的三个button:

 <?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load"> <ribbon> <tabs> <tab id="TabAdvComTracking" idMso="TabAdvComTrackingMso" label="Adv.com Tracking"> <group id="groupPrepare" label="Prepare"> <button id="GenerateNewWorkbook" idMso="GenerateNewWorkbookMso" enabled="1" size="large" onAction="GenNewWorkbook" label="Make" /> <separator visible="1"/> <button id="ClearData" idMso="ClearDataMso" enabled="1" size="large" onAction="ClearData" label="Clear" /> </group> <group id="GroupDoIt" idMso="GroupDoItMso" label="Just Do It"> <button id="CaptureIds" idMso="CaptureIdsMso" enabled="1" size="large" onAction="CaptureData" label="Eat" /> </group> </tab> </tabs> </ribbon> </customUI> 

MyRibbon.cs看起来像这样:

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using Office = Microsoft.Office.Core; using Excel = Microsoft.Office.Interop.Excel; namespace AdvComTrackingAddIn { [ComVisible(true)] public class MyRibbon : Office.IRibbonExtensibility { private Office.IRibbonUI ribbon; public MyRibbon() { } #region IRibbonExtensibility Members public string GetCustomUI(string ribbonID) { //ribbonID when loaded into Excel should be Microsoft.Excel.Workbook return GetResourceText("AdvComTrackingAddIn.MyRibbon.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) { this.ribbon = ribbonUI; } public void GenNewWorkbook(Office.IRibbonControl control) { Excel.Workbook newWorkBook = Globals.ThisAddIn.Application.Workbooks.Add(); Excel.Worksheet newWorkSheet = (Excel.Worksheet)newWorkBook.Worksheets.Add(); newWorkSheet.Name = "DBTS " + GetDateRange("MMDDYYYY"); } public string GetDateRange(string format){ string day = DateTime.Now.DayOfWeek.ToString(); int offSet = 0; if(day == "Sunday") offSet = 1; else if(day == "Monday") offSet = 0; else if(day == "Tuesday") offSet = -1; else if(day == "Wednesday") offSet = -2; else if(day == "Thursday") offSet = -3; else if(day == "Friday") offSet = -4; else if(day == "Saturday") offSet = -5; DateTime MondayStartDate = DateTime.Now.AddDays(offSet); return MondayStartDate.ToString(format) + "_" + MondayStartDate.AddDays(4).ToString(format); } public void ClearData(Office.IRibbonControl control) { Excel.Sheets wksheets = Globals.ThisAddIn.Application.Worksheets; Excel.Worksheet sheet; for(int i = 0; i < wksheets.Count; i++){ sheet = wksheets[i]; if(sheet.Name.StartsWith("DBTS")){ sheet.get_Range("A6:H12").Clear(); sheet.get_Range("A16:D22").Clear(); sheet.get_Range("A26:D10000").Clear(); } else if(sheet.Name == "Advisory.com Activity"){ sheet.get_Range("A4:B10000").Clear(); sheet.get_Range("D4:F10000").Clear(); sheet.get_Range("H4:J10000").Clear(); } else if(sheet.Name == "Unique Hits Per URL"){ sheet.get_Range("A4:E10000").Clear(); } } } public void CaptureData(Office.IRibbonControl control) { } #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.cs看起来像这样:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using Excel = Microsoft.Office.Interop.Excel; using Office = Microsoft.Office.Core; using Microsoft.Office.Tools.Excel; using System.IO; using System.Reflection; namespace AdvComTrackingAddIn { public partial class ThisAddIn { private void ThisAddIn_Startup(object sender, System.EventArgs e) { Globals.ThisAddIn.Application.get_Range("A1").Value = "COM add-in loaded"; } private void ThisAddIn_Shutdown(object sender, System.EventArgs e) { GC.Collect(); } protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new MyRibbon(); } #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 } } 

您应该删除您的重写CreateRibbonExtensibilityObject。 默认情况下,这由ThisAddIn的基类实现,并调用CreateRibbonObjects。 您可以重写CreateRibbonObjects(这应该返回所有Ribbon对象的数组),或者让CreateRibbonObjects的默认实现完成它(也就是说,每次启动插件时都要反映整个程序集)。

你可以在这个博客文章中阅读更多关于所有这些关系的信息

我遇到了同样的问题。 我有一个不正确的XML文件path,它返回空:

  public string GetCustomUI(string ribbonID) { return GetResourceText("CheckThisIsTheCorrectNameSpace.Ribbon.xml"); } 

硬编码一个string命名空间不是一个好主意,主要是因为它们不是重构,以及我们的同胞Stackoverflow'rs在下面的评论中提到的有益的理由。

尝试更改默认的TabAddIns时遇到同样的问题。 我看到的是,idMso是办公室栏选项卡和id是新的选项卡。 以下为我工作。

 <tab id="TabAdvComTracking" tag="TabAdvComTracking" label="Adv.com Tracking" visible="true" insertAfterMso="TabAddIns">