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

问题描述 投票:1回答:1

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

由于我对VSTO或Office扩展一般都是新手,我似乎没有找到任何专门的事件或其他可能性来识别用户在Excel中选择嵌入式图表的那一刻。

到目前为止,我环顾四周尝试了两件事,但两件似乎都没有按照我的意图行事:

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

在查看Interop API一段时间后没有成功(由于我对VSTO缺乏经验,我可能没有找到合适的位置),我尝试了一个非常粗略的解决方案,看看是否有什么对我有用。

我创建了一个形成Application.ActiveChart属性的线程,并且一旦它不为null,我就会检索我需要的信息并将其显示在我的任务窗格中 - 否则我将其隐藏起来。

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

我怎样才能实现一个解决方案,一旦发生,就会识别用户在Excel中选择的图表?有关VSTO的任何指示或其他说明我可能需要知道吗?

c# excel vsto add-in
1个回答
0
投票

似乎没有为此目的的专门活动。我使用了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-sheetselectionchange-event-doesnt-occur-if-the-selection-is-on-a-chart?forum=vsto

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

但是,此事件被激活了很多,所以要小心事件触发的代码。

希望有所帮助!问候

© www.soinside.com 2019 - 2024. All rights reserved.