Excel VSTO在启动时未触发NewWorkbook事件

4

我正在开发一个基于Excel 2010的应用级插件。我需要编写处理程序来处理与Workbook接口相关联的一些应用程序事件,特别是NewWorkbook事件。

因此,在ThisAddIn_Startup处理程序中,我添加了以下代码:

Microsoft.Office.Interop.Excel.AppEvents_Event app = Globals.ThisAddIn.Application;
app.NewWorkbook += MyApp_NewWorkbook;

当在运行的Excel实例中创建新工作簿时,它可以正常工作。但是,当我运行新的Excel实例(通常情况下,这意味着创建新的工作簿)时,此事件不会被我的处理程序捕获。我认为,当我运行新的Excel实例时,NewWorkbook事件发生在ThisAddIn_Startup事件之前。
在打开现有工作簿以及双击文件时,WorkbookOpen事件的应用程序表现得就像我预期的那样-事件被捕获。我想知道为什么这些事件的处理方式不同?
在这种情况下,我该怎么办?我需要识别是否创建了新的工作簿或打开了现有的工作簿,无论Excel是否已经运行。

空白的工作簿模板不算作“打开工作簿”。我认为你需要注册一些应用程序启动事件来处理这种情况。 - Mathieu Guindon
2个回答

1
当您的插件加载时,如何在所有打开的工作簿上执行操作?
在ThisAddIn_Startup处理程序中添加以下代码行,类似于下面这个示例(此处手动编写,没有IDE):
foreach (var workbook in Globals.ThisAddIn.Application.Workbooks)
{
  // Do your thing
}

然后使用事件处理程序来捕获随后打开的任何工作簿。

我在考虑这个解决方案,可能这是唯一的解决方案,但结合了Kiru的答案。在启动时,我将遍历所有工作簿的集合,并对未保存的工作簿执行我的操作。这将消除处理工作簿两次打开的风险 - 在启动时和在WorkbookOpen事件处理程序中。 - Rav

1
在WorkbookOpen事件中检查


string.IsNullOrEmpty(application.ActiveWorkbook.Path)

这意味着您的工作簿从未保存。当您打开Excel时创建的所有新工作簿都符合上述行。

没问题,但它并没有涵盖创建新工作簿的情况,因为WorkbookOpen事件不会被触发。但我可以考虑在其他地方使用它 - 比如在启动时 :) - Rav
我会将它与Chris Spicer的答案结合起来,希望它能够运行。 - Rav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接