【问题标题】:VSTO Excel template are not loaded when other EXCEL files are open打开其他 EXCEL 文件时不加载 VSTO Excel 模板
【发布时间】:2019-02-26 08:55:20
【问题描述】:

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

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

【问题讨论】:

    标签: c# excel vsto


    【解决方案1】:

    我相信您已经创建了文档级自定义。这意味着您将看到您的按钮/代码仅针对 one 工作簿运行。 如果您真的希望您的功能区仅适用于某些类型的工作簿,请创建 工作簿模板 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 加载项并根据某些文档属性等设置功能区的可见性(功能区回调)。这样您的加载项每次都会加载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

    【讨论】:

    • 如果我理解正确,为了使用功能区面板,我必须制作 VSTO 插件(不是文档级自定义)?但在这种情况下,我的功能区面板将在每个 Excel 文档中启动。如果我只想在某个文档中查看我的面板怎么办?
    • @Andrey 我根据您的评论编辑了我的答案,希望对您有所帮助
    • PetLahev - 非常感谢您的解释。这对我来说是非常有用的。我会尝试根据您的建议重做我的项目。
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多