打开其他EXCEL文件时未加载VSTO Excel模板

时间:2019-02-26 08:55:21

标签: c# excel vsto

有问题。我有vsto Excel模板(c#)。这个可以完美地工作,但是如果与其他文件一起工作,Excel就会发生一些神秘的事情。从加载项退出后,我可以t enter to it again until i关闭其他Excel文件。我以为退出加载项取决于错误的方法,但是我尝试了以下无法解决问题的方法:

  private void ThisWorkbook_Shutdown(object sender, System.EventArgs e)
{
    Application.Quit();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

1 个答案:

答案 0 :(得分:1)

我相信您已经创建了文档级定制。这意味着您将看到仅针对一个工作簿运行的按钮/代码。 如果您真的想让功能区仅适用于某些类型的工作簿,则创建一个工作簿模板 xltx。 (不是xlsx,xlsb或xlsm ) 通过模板创建的所有工作簿都将具有您的自定义功能。请从Microsoft查看此指南-Get started programming document-level customizations for Excel

概念是这样的。

  1. 您在Visual Studio中创建VSTO模板自定义
  2. 制作功能区,编写代码并构建项目
  3. 在您的 Release 文件夹中,您将获得Excel模板,例如ExcelTemplate.xltx
  4. 将此文件分发给您的客户
  5. 每次有人从您的模板创建新工作簿时,都会进行自定义,但标准Excel文件不会

老实说,我认为多年来我只创建了一个这样的项目(通常我做VSTO加载项)。我不知道当您或您的客户可能已经基于模板的一个版本创建了数千个文件时,您将如何管理更新/错误修复=>事先考虑要有一些更新逻辑/版本系统。 我似乎记得我所做的一个项目在非开发人员计算机上运行代码时遇到了一些问题。我会说我必须手动调整注册表才能运行它,但它可能会更改,实际上是5-6年前(甚至更多

您还可以考虑使用VSTO加载项,并根据某些文档属性等来设置Ribbon的可见性(功能区回调)。因此,您将拥有每次加载的加载项Excel已加载,但基于一些内部检查,它将使Ribbon可见或隐藏。

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        Globals.ThisAddIn.Application.WorkbookOpen += Application_WorkbookOpen;
        Globals.ThisAddIn.Application.WorkbookActivate += Application_WorkbookActivate;
    }

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        Globals.ThisAddIn.Application.WorkbookOpen -= Application_WorkbookOpen;
        Globals.ThisAddIn.Application.WorkbookActivate -= Application_WorkbookActivate;
    }

    private void Application_WorkbookActivate(Excel.Workbook Wb)
    {
        var passThisValueToRibbonCallback = IsSupportedDocument(Wb);
    }

    private void Application_WorkbookOpen(Excel.Workbook Wb)
    {
        var passThisValueToRibbonCallback = IsSupportedDocument(Wb);
    }

    /// <summary>
    /// An example how to check if opened/activated document is 'your' document
    /// </summary>
    /// <param name="workbook"></param>
    /// <returns></returns>
    private bool IsSupportedDocument(Excel.Workbook workbook)
    {
        var props = workbook.CustomDocumentProperties;
        try
        {                
            var myCustomProperty = props.Item["myPropertyThatWillBeJustInMyWorkbooks"];
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    }

也请检查此Features available by Office application and project type