【发布时间】:2014-03-12 13:01:42
【问题描述】:
我正在为 Excel 2007+ 构建一个 COM 插件,这将是一个应用程序:
- 它在功能区上有自己的选项卡,带有控制其操作的按钮(例如“创建新的计划工作簿”/“刷新工作簿”等)
- 它将捕获来自 Excel(应用程序和工作簿)的事件并对其采取行动。
- 它应该有一个基于上下文的任务窗格,并且会从我的插件向它发送数据。
为了支持这一点,我想以这样一种方式构建代码,以便我将来可以轻松地修改它(例如,在功能区上添加一个新按钮),而不是到处都是意大利面条。
我最初的想法是创建一个单例类,这将是我的“插件应用程序”,并使用 Excel 应用程序本身对其进行初始化,例如:
public class Connect : Extensibility.IDTExtensibility2 {
private Excel.Application _excelApplication;
private MyAddinApplication _myAddinApplication;
public void OnConnection(Object application,...) {
_excelApplication = (Excel.Application)application;
_myAddinApplication = new MyAddinApplication(_excelApplication);
}
}
然后,这个 MyAddinApplication 类将捕获 Excel 的事件(例如打开工作簿、关闭等),然后对它们进行相应的操作。它还将捕获任何功能区事件或回调,然后根据命令模式触发操作。
我的问题是,对于 Excel COM 插件,这是一种合理的方法吗? 将 Excel 应用程序封装在我的“插件应用程序”类引用的单独“事件处理程序”类中会更好吗?在我的研究中,我并没有真正看到复杂的 COM 插件,只有具有一两个按钮或不捕获任何事件的插件。
【问题讨论】:
-
我会考虑看看exceldna.codeplex.com - 它有很多功能和相当不错的设计。由于插件基于 Xll 而不是 COM,因此速度更快。
-
好吧,您正在制作一个已经为您准备好的 VSTO 加载项,所以我不明白您的问题。当您将按钮添加到带有事件的功能区时,您将被重定向到存储所有按钮事件的解决方案中的正确位置(代码块)。创建 CustomTaskPane 时,您很可能会为任何与 CTP 相关的内容添加文件夹 CustomTaskPane...我真的不明白您要在这里重新构建什么...您是否真的构建了一个并熟悉当前VS建议的解决方案和代码结构?你不喜欢它什么
-
@mehow 我根本不使用 VSTO,这是一个普通的 COM 插件。
-
就您所描述的目的而言,VSTO 非常完美。为什么要重新发明轮子?您应该真正考虑将您的 plain com-add-in 转换为最终用于相同目的的 VSTO 加载项。见this interesting read
标签: c# excel ms-office excel-addins