打开其他 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
概念是这样的。
- 您在 Visual Studio
中创建了 VSTO 模板自定义
- 制作你的功能区,编写你的代码并构建你的项目
- 在您的 Release 文件夹中,您将获得 Excel 模板,例如
ExcelTemplate.xltx
- 将此文件分发给您的客户
- 每次有人从您的模板创建新工作簿时,它都会有您的自定义,但标准 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
有问题。我有 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
概念是这样的。
- 您在 Visual Studio 中创建了 VSTO 模板自定义
- 制作你的功能区,编写你的代码并构建你的项目
- 在您的 Release 文件夹中,您将获得 Excel 模板,例如
ExcelTemplate.xltx
- 将此文件分发给您的客户
- 每次有人从您的模板创建新工作簿时,它都会有您的自定义,但标准 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