【问题标题】:Design structure for C# Excel COM AddinC# Excel COM Addin 的设计结构
【发布时间】: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


【解决方案1】:

这是您可以查看的一个(稍微复杂一点的)Excel 插件。作者描述了他如何将他的解决方案组织到不同的项目中,我同意他的大部分决定。他将域逻辑与用户界面/excel 分开,还添加了单元测试项目和一个引导他的整个插件的项目:

http://www.clear-lines.com/blog/post/VSTO-solution-organization.aspx

源代码可在此处获得: http://vstostocks.codeplex.com/

这是一个 VSTO 解决方案,但您可以轻松地将相同的原理应用于普通的 COM 插件。它也与您的项目非常相似。

在不了解具体问题的情况下很难给出指导。我认为,如果您在 SOLID 等面向对象设计方面坚持主要准则,编写干净的代码,您应该没问题。

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多