识别 Excel 加载项(使用 VSTO)中的图表选择



我有一个相当小的任务,即在 C# 中使用 VSTO 创建 Excel 加载项(这是一项要求),一旦在任何工作簿/工作表中选择图表,我就必须在 TaskPane 中提供一些信息。

由于我一般对VSTO或Office扩展完全陌生,因此我似乎找不到任何专用事件或其他可能性来识别用户在Excel中选择嵌入式图表的那一刻。

到目前为止,我环顾四周并尝试了两件事,但似乎都不像我打算的那样起作用:

  1. 侦听Application.SheetSelectionChange事件以截取图表的选择。我很快发现,当选择了图表时,此事件不会触发。文档指出,ChartSheets不会发生这种情况,所以我想嵌入式图表也是如此。
  2. 激活工作表后立即遍历所有图表,并附加到可能的Activated 事件。但令我惊讶的是,没有(据我所知)。

在浏览了一段时间的互操作 API 但没有成功之后(由于我对 VSTO 缺乏经验,我可能没有在正确的地方寻找),我尝试了一个非常粗糙的解决方案,只是为了看看是否有任何东西适合我。

我创建了一个轮询Application.ActiveChart属性的线程,一旦它不为 null,我就会检索我需要的信息并将其显示在我的 TaskPane 中 - 否则我会隐藏它。

当然,这个解决方案是我真的不想使用的解决方案,尤其是在 COM 下的多线程可能非常迅速地非常无情的情况下。

如何实现一个解决方案,以便在 Excel 中选择图表时立即识别用户?我可能需要了解的有关 VSTO 的任何指示或其他说明?

似乎没有专门用于此目的的活动。我使用了CommandBar.OnUpdate事件(.NET Reference),该事件在选择图表时也会触发:

using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Excel.Application excelApp = Globals.ThisAddIn.Application;
excelApp.CommandBars.OnUpdate += new Office._CommandBarsEvents_OnUpdateEventHandler(CommandBars_OnUpdate);
//Other code to be executed at startup
}
private void CommandBars_OnUpdate()
{
Excel.Application excelApp = Globals.ThisAddIn.Application;
Excel.Chart activeChart = null;
try
{
activeChart = excelApp.ActiveChart;
if (activeChart != null)
{
//Code to be triggered
}
}
catch
{
}
}

我受到这两个来源的启发,其中这种方法用于检测形状的选择:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/792c0159-863f-4db9-90be-25be94e875fb/any-workaround-sheetselection更改事件不会发生,如果选择在图表上?forum=vsto

https://code.msdn.microsoft.com/office/CSExcelNewEventForShapes-0e26b1f2

但是,此事件经常触发,因此请注意事件要触发的代码。

希望对您有所帮助! 问候

最新更新