VSTO Excel Com Добавить в ленте не загружается - PullRequest
5 голосов
/ 09 августа 2010

Я использую 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
    }
}

Ответы [ 3 ]

4 голосов
/ 03 декабря 2012

Я столкнулся с той же проблемой.У меня был неверный путь к XML-файлу, и он возвращал пустой:

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

Жесткое кодирование пространства имен в виде строки не очень хорошая идея, в основном потому, что они не поддерживают рефакторинг, а также полезныпричины, по которым наши коллеги Stackoverflow упоминают в комментариях ниже.

3 голосов
/ 10 августа 2010

Вы должны удалить переопределение CreateRibbonExtensibilityObject. По умолчанию это реализуется базовым классом ThisAddIn и вызывает CreateRibbonObjects. Вы можете либо переопределить CreateRibbonObjects (это должно вернуть массив всех ваших объектов Ribbon), либо просто позволить реализации по умолчанию CreateRibbonObjects делать свое дело (то есть отражать всю сборку каждый раз, когда запускается ваше дополнение).

Подробнее о том, как все это связано, можно узнать из этого сообщения в блоге

2 голосов
/ 05 декабря 2010

У меня та же проблема при попытке изменить стандартные TabAddIns. То, что я вижу, - то, что idMso для вкладок панели управления и id для новых вкладок Следующее работает для меня.

<tab id="TabAdvComTracking" tag="TabAdvComTracking" label="Adv.com Tracking" visible="true" insertAfterMso="TabAddIns">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...