2011-09-19 32 views
5

起初,我实现了,将调用Web方法同步方式的UDF,但有相当多的与烦恼,尤其是当我试图请求庞大的数据量 - 简而言之,Excel将挂起并冻结,直到检索到所有数据,这严重危害用户体验。实现一个Excel UDF可以调用Web方法异步

我猜测同步使用Web服务是真正的杀手锏。所以我想知道是否有什么办法可以做到这一点异步?任何人都可以给我一些指点吗?任何工具或平台更受欢迎? (我个人更喜欢使用C#)

+0

似乎udf需要返回两次才能正常工作:一次在开启Web通话后再次返回结果。可能更好地使用工作表更改事件来完成调用? –

+0

@Tim你能详细解释一下吗?有没有例子呢? – woodykiddy

回答

5

RTD可以工作。你必须实现IRtdServer接口。当你的加载项开始时,Excel会给你一个函数指针。对于每个单元格,您将获得“excel id”和参数列表。发送您的异步Web请求。当响应到达时,您可以调用Excel提供的notfiy函数。当Excel准备就绪时,它会调用您的GetData方法来实际获取数据。

有关如何在C#中执行此操作的示例,请参见How do I create a real-time Excel automation add-in in C# using RtdServer?

一旦你了解RTD是如何工作的,Excel-DNA在抽象化COM管道方面做得很好......强烈推荐。

+0

感谢您的链接。我认为这会有所帮助。 – woodykiddy

0

我不使用c#与Excel,只是VBA,但我想象类似的约束适用。通过udf调用远程的问题(尤其是当你这么做的时候)是工作簿开始变得没有响应,并且你无法控制计算的发生。但是,即使您可以弄清楚如何异步运行udf,它也可能会破坏Excel内部跟踪如何计算工作簿来处理单元依赖关系。

在服务器上进行了哪些计算?你可以将它们移动到一个加载项中,从而提高UDF的性能吗?

如果你不能这样做,那么你可以尝试一种事件驱动的方法(例如,使用前面提到的工作表变化事件),但是仍然有困难,你可能需要确保整个工作表最终结束完全计算,并且这样做可能比它的价值更多的工作。不要忘记,即使在异步运行时,您的操作系统可以一次打开多少个连接也是有限制的,所以它不像您一次可以发送数十个单元的呼叫...

1

I对该技术没有经验,但似乎Excel RTD(实时数据)可能是一种方法。查看与ExcelDNA相关的this thread,其中概述了一种方法。希望这可以帮助!

0

一个很好的教程与例子可用here