【问题标题】:Excel VSTO NewWorkbook event doesn't occur on startupExcel VSTO NewWorkbook 事件不会在启动时发生
【发布时间】:2013-08-06 15:12:12
【问题描述】:

我正在开发一个 Excel 2010 应用程序级插件。我需要为一些与 Workbook 接口相关的 Application 事件编写处理程序,尤其是 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 实例中打开现有工作簿以及双击文件时捕获事件。我想知道为什么这些事件的处理方式不同?

在这种情况下我该怎么办?无论 Excel 是否已在运行,我都需要识别是否创建了新工作簿或打开了现有工作簿。

【问题讨论】:

  • 我认为空的工作簿模板不算作“打开工作簿”。您必须注册一些应用启动事件来处理这种情况。

标签: c# excel vsto


【解决方案1】:

如何对加载项加载时打开的所有工作簿执行操作?

ThisAddIn_Startup 处理程序中的内容类似于以下内容? (这里没有IDE,所以手写):

foreach (var workbook in Globals.ThisAddIn.Application.Workbooks)
{
  // Do your thing
}

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

【讨论】:

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

在 WorkbookOpen 事件中检查

string.IsNullOrEmpty(application.ActiveWorkbook.Path)

这意味着您的工作簿永远不会保存。打开 Excel 时创建的所有新工作簿都适用于上述行。

【讨论】:

  • 没关系,但它不包括创建新工作簿的情况,因为那时没有引发 WorkbookOpen 事件。但我可以考虑在其他地方使用它 - 例如在启动时:)
  • 我会将它与 Chris Spicer 的答案结合起来,希望它能奏效。
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多