我有一个基于 RtdServer 的可用自动化插件:
如何使用 RtdServer 在 C# 中创建实时 Excel 自动化插件? https://stackoverflow.com/questions/5397607/howto-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)”时,它显示初始值 150,该值由 ConnectData 返回但从未更新。我应该注册一些回调吗?我是否正确实例化了应用程序对象?我缺少什么?
Thanks,
Frank
事实上,您没有获得正确的 Application 对象。一种解决方案是实施IDTE扩展性2 http://msdn.microsoft.com/en-us/library/extensibility.idtextensibility2%28v=VS.100%29.aspx您的加载项中的界面。此接口有一个 OnConnection 方法,Excel 在加载加载项时将调用该方法。在此方法中,您将传递 Application 对象,您可以将其保存在局部变量中以供以后使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)