【问题标题】:Automation add-in vs. COM add-in自动化插件与 COM 插件
【发布时间】:2011-01-01 05:06:50
【问题描述】:

我是插件编程的新手,在以下情况下需要帮助:

我有一个 C# Excel 自动化加载项,它调用了几个 UDFs。我想在加载自动化加载项期间进行用户名和密码检查,在加载加载项时必须弹出用户可以输入其详细信息的屏幕。如何使用自动化插件来完成?

一般如何使用自动化插件完成事件处理?我希望在用户按下 F9 来计算某些单元格中的 UDF 公式时进行一些计算。

是否有任何文章解释了自动化插件中的事件处理?

【问题讨论】:

    标签: c# excel events automation add-in


    【解决方案1】:

    一般来说,自动化加载项不是为处理此类功能而设计的。您可以让加载项实现 IDTExtensibility2 以获取对正在运行加载项的“Excel.Application”对象的引用。从那里,您可以访问“Excel.Application”类的所有事件。但自动化加载项通常不是为处理 Excel 对象模型事件而设计的——它只是为支持用户定义的函数 (UDF) 而设计的。

    我想做一个用户名和密码 检查自动化插件的时间 加载哪个屏幕 用户可以输入他的详细信息必须弹出 加载加载项。怎么可能 使用自动化插件完成了吗?

    当您的自动化插件首次加载时,请注意不要尝试采取行动。自动化加载项是按需加载的,这意味着在 Excel 需要它之前不会加载它。它通常会在用户开始将自动化加载项的第一个用户定义函数 (UDF) 输入到单元格时加载。问题是当用户仍在编辑单元格时尝试执行时,大多数编程命令都会失败。因此,如果您在首次加载加载项时尝试执行此类操作,则很有可能在 Excel 处于不允许您的代码安全执行的模式时加载。 (有关更多信息,请参阅:Excel fails when Automation add-In loads。)

    要解决此问题,您可以改用托管 COM 加载项,该加载项旨在处理 Excel 对象模型事件。如果您愿意,您的托管 COM 插件甚至可以加载您的自动化插件;或者托管 COM 加载项类和自动化加载项类都可以驻留在同一个程序集中,在这种情况下,它们可以直接通信。

    如何进行事件处理 一般使用自动化插件?一世 想要在什么时候进行一些计算 用户按 F9 计算 一些单元格中的udf公式。

    可以通过订阅“Excel.Application.SheetCalculate”事件来检测 F9 键何时被按下,该事件将在任何工作表完成计算时触发。在这种情况下,可以出于任何原因触发计算,而不仅仅是按 F9 键。如果您希望专门捕获 F9 键,则需要使用仅通过 VBA 可用的“Application.OnKey”回调。但是,您可以将项目中的一个类公开给 COM,并从从“Application.OnKey”事件回调的 VBA 加载项中调用它。

    有关自动化插件的文章,请参阅:

    有关托管 COM 加载项的文章,请参阅:

    有关 COM 插件和自动化插件的文章,请参阅:

    有关讨论使用调用托管应用程序的 VBA 插件的文章,请参阅:

    我知道要消化的内容很多,但希望这可以让您继续前进。总的来说,我建议使用托管 COM 加载项来处理您的用户界面功能。托管 COM 加载项保存的数据可以很容易地与自动化加载项共享,方法是让两个加载项都引用一个公共程序集,或者同时让托管 COM 加载项类和自动化加载项在同一个大会举行的课堂上。

    我希望这会有所帮助,如果您希望我进一步澄清任何事情,请询问。

    -- 迈克

    后续回复:

    非常感谢您的链接和指针。我浏览了这些链接,并对需要做的事情有了一个清晰的认识。:)

    很高兴它有帮助。 :) 阅读量很大,我建议您将它们打印出来并全部阅读。您正在寻求做一些相当先进的事情,因此您对该主题了解得越多,您的情况就会越好。

    如果我使用基于 COM 的插件来处理我的 excel 事件,我如何合并我的 UDF 函数?

    托管 COM 加载项无法公开 UDF 函数。为此,您仍然需要一个自动化插件。但是,如果您愿意,您的托管 COM 加载项类和自动化加载项类都可以在同一个程序集中。因此,您的 COM 加载项可能会向用户询问您需要的信息,并且当其中的 UDF 运行时,这些值将可供自动化加载项使用。

    它们会在公式窗格中显示为普通函数,类似于使用自动化插件的情况吗?

    您的自动化插件公开的 UDF 将自动包含在“插入函数”向导中,位于与您的自动化插件名称匹配的类别下。但是,描述不会自动包含为 Excel 的内置函数提供的那么多信息。默认功能通常很好,但如果您希望为“插入函数”向导提供更完整的信息,这本身就是一个复杂的话题。见:Excel 2007 UDF: how to add function description, argument help

    假设我需要调用一个返回数字立方的公式 getcube public double getcube(double a) { return a * a * a; }

    当我的插件同时使用定义我的 UDF 和 IDTExtensibility2 的自定义接口时,我该如何处理这种情况?可以举个例子解释一下这个案例吗?

    到目前为止,根据您在此处显示的内容,我认为不需要实现 IDTExtensibility2,您只需要一个标准的自动化插件。对于标准自动化插件,您应该阅读Writing user defined functions for Excel in .NETWriting Custom Excel Worksheet Functions in C#。有关如何为托管 COM 加载项实现 IDTExtensibility2 的讨论,请参阅Implementing IDTExtensibility2 in an Automation Add-in

    有没有办法只在自动化插件上实现 IDTExtensibility2 以访问 Excel.Application 对象,还是应该为它创建一个单独的 COM 插件?

    您绝对可以在您的自动化插件中直接实现 IDTExtensibility2,无需为此创建托管 COM 插件。再次,请参阅Implementing IDTExtensibility2 in an Automation Add-in。但是,您希望实现的是针对 Excel 对象模型使用事件处理。虽然这可以使用自动化插件来完成,但它是非标准的,也不是自动化插件旨在完成的任务。特别是,您希望在首次加载自动化插件时让用户输入信息;这可能是一个特别棘手的情况,这就是为什么我建议您使用托管 COM 加载项来完成此任务。有关这方面的更多信息,请参阅Excel fails when Automation add-In loads

    为了澄清,托管 COM 加载项和自动化加载项只是使 COM 可见并正确注册的类。这两个类没有理由不能存在于同一个程序集中。而且,由于听起来您希望您的功能同时包含 UDF 和 Excel 对象模型事件处理,因此包含托管 COM 加载项和自动化加载项的单个程序集将使您能够处理您寻求的所有功能Excel 所期望的方式。

    我知道这要消化的东西很多,但是如果您仔细阅读我在这里建议的文章,我认为它会很有意义...

    迈克

    【讨论】:

    • 非常感谢。事情已经慢慢开始明朗了。我仍然坚持将我的自动化插件和 com 插件放在同一个程序集中。您能否举个例子来解释一下,以便我更好地理解它?
    • 他们不必如此。每个都是一个单独的类。如果需要,您可以将每个加载项类放在一个单独的程序集中,然后让两个程序集引用第三个程序集。不过,在您的情况下,我认为将自动化插件类和托管 COM 插件类放在同一个程序集中是最简单的。遵循有关如何使用向导制作托管 COM 加载项的文章。然后按照有关如何制作自动化加载项类的文章进行操作,但将自动化加载项类放在与托管 COM 加载项相同的程序集中。真的就是这么简单。
    • @MikeRosenblum 我目前正在处理 Excel 自动化插件项目,但遇到了一些麻烦。我的 UDF 需要通过 Web 服务获取数据,因此会担心性能问题。如果我以同步方式执行此操作,Excel 客户端应用程序将冻结。所以我的问题是——我们如何编写一个可以异步调用网络方法的UDF?你能给我一些建议吗,迈克?非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多