VSTO Excel Com Добавить в ленту не загружается

Я использую VS 2010 для разработки надстройки COM для Excel 2007. Поскольку это проект Office 2010 VS, он предназначен для .NET 4.0 Client Framework. Я добавил новый элемент ленты (XML) под названием MyRibbon, поэтому имена файлов по умолчанию для 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
    }
}
5
задан Michael 10 August 2010 в 12:43
поделиться