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

VSTO Excel template are not loaded when other EXCEL files are open

有问题。我有 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();
}

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

概念是这样的。

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

老实说,我想多年来我只创建了一个这样的项目(通常我做 VSTO 加载项)。我不知道您将如何管理 updates/bug-fixes,而您或您的客户可能已经基于一个版本的模板创建了数千个文件 => 提前考虑更新 logic/versioning 系统。 我似乎记得我做过的一个项目 运行 非开发人员机器上的代码有一些问题。我会说我必须手动调整注册表才能获得它 运行 但它可能会改变它实际上是 5-6 年前( 甚至更多

您还可以考虑 VSTO 加载项并根据某些文档 属性 等设置功能区的可见性(功能区回调)。这样您将拥有您的加载项将在每次 Excel 加载时加载,但根据一些内部检查,它会使功能区可见或隐藏。

    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