[英]VSTO Excel Com Add In Ribbon Not Loading
我正在使用 VS 2010 開發 Excel 2007 COM 加載項。 因為它是一個 VS 2010 Office 項目,所以它針對 .NET 4.0 客戶端框架。 我添加了一個名為 MyRibbon 的新功能區 (XML) 項目,因此默認文件名是 ThisAddIn.cs、MyRibbon.cs 和 MyRibbon.xml。
一切都很好。 它以 .vsto 擴展名發布。 當我安裝加載項(通過提供的 Setup.exe)時,它會在 Excel 中安裝,並在 COM 加載項列表中進行檢查。 它也被指定在啟動時加載。 但是,無論是先打開 Excel 還是打開 Excel 文件,都不會將選項卡添加到功能區。
我可以告訴加載項加載,因為它將“COM 加載項加載”放在第一個工作表的第一個單元格中。 看起來好像 CreateRibbonExtensibilityObject() 沒有被調用。
有沒有人有任何想法,或者可以告訴我如何顯示可能被掩埋的任何錯誤消息?
詳情如下。
我添加了 CreateRibbonExtensibilityObject() 的覆蓋:
protected override Office.IRibbonExtensibility CreateRibbonExtensibilityObject()
{
return new MyRibbon();
}
MyRibbon.xml 看起來像這樣,三個按鈕在一個選項卡內的一組中:
<?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
}
}
我遇到了同樣的問題。 我有一個不正確的 XML 文件路徑,它返回空:
public string GetCustomUI(string ribbonID)
{
return GetResourceText("CheckThisIsTheCorrectNameSpace.Ribbon.xml");
}
將命名空間硬編碼為字符串不是一個好主意,主要是因為它們不能重構以及下面的有用注釋。
我在嘗試更改默認 TabAddIns 時遇到了同樣的問題。 我看到的是 idMso 用於辦公室欄標簽,而 id 用於新標簽。 以下對我有用。
<tab id="TabAdvComTracking" tag="TabAdvComTracking" label="Adv.com Tracking" visible="true" insertAfterMso="TabAddIns">
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.