【问题标题】:How do I create an Excel automation add-in in C# that wraps an RTD function?如何在 C# 中创建包装 RTD 函数的 Excel 自动化加载项?
【发布时间】:2012-07-31 12:20:56
【问题描述】:

我有一个可用的基于 RtdServer 的自动化插件:
How do I create a real-time Excel automation add-in in C# using RtdServer?

创建一个 VBA 包装器很简单:

Function RtdWrapper(start)
    RtdWrapper = Excel.Application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", "", start)
End Function

这行得通。我试图创建一个 C# 包装器,如下所示:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class RtdWrappers
{
    private readonly Microsoft.Office.Interop.Excel.Application _application = new Application();

    public object Countdown(object startingCount)
    {
        var start = Convert.ToInt32(startingCount.ToString());
        return _application.WorksheetFunction.RTD("StackOverflow.RtdServer.ProgId", string.Empty, start);
    }

    [ComRegisterFunctionAttribute]
    public static void RegisterFunction(Type t)
    {
        Microsoft.Win32.Registry.ClassesRoot.CreateSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
    }

    [ComUnregisterFunctionAttribute]
    public static void UnregisterFunction(Type t)
    {
        Microsoft.Win32.Registry.ClassesRoot.DeleteSubKey("CLSID\\{" + t.GUID.ToString().ToUpper() + "}\\Programmable");
    }
}

当我在 Excel 中的一个单元格中输入“=Countdown(150)”时,它会显示 ConnectData 返回但从不更新的初始值 150。我应该注册一些回调吗?我是否正确实例化了 Application 对象?我错过了什么?

谢谢,

弗兰克

【问题讨论】:

    标签: c# vsto excel-addins rtd excel-udf


    【解决方案1】:

    确实,您没有获得正确的 Application 对象。一种解决方案是在加载项中实现IDTExtensibility2 接口。此接口有一个 OnConnection 方法,Excel 将在加载您的加载项时调用该方法。在此方法中,您将获得 Application 对象,您可以将其保存在局部变量中以备后用。

    【讨论】:

    • 我也没有检查它 - 随后我遇到了一篇文章 (blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.asp),它表明 IDTExtensibility2 没有用于自动化加载项。如果是这样,看起来使用 Excel-DNA 之类的东西作为 Excel 加载项可能是在 .NET 中执行此操作的唯一方法。
    • 但在 Stackoverflow 的这个答案 stackoverflow.com/questions/1998824/… 中,Mike 非常强调您可以在自动化插件上实现 IDTExtensibility2 以获取 Application 对象。
    • 是的,COM 插件和自动化插件都是公开 COM 接口的简单类。没有理由他们不能都在同一个程序集中。只需让 COM 插件类将 Excel.Application 引用保存在静态字段中,然后可以从驻留在同一程序集中的自动化插件类中引用此静态字段。
    • 一个不清楚的问题是,当库仅作为自动化加载项加载以提供 UDF 功能时,是否会调用该 COM 类上的 IDTExtensibility2 接口。 AFAIK IDTExtensibility2 接口在 UDF 服务器被激活时被探测和调用,即使它没有在 Excel 中注册为“COM 加载项”。不过最近没查过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多