我使用 Visual Studio 2010 编写了一个 VSTO Excel 插件,在设法解决了微软在正义开发者的道路上设置的大部分障碍之后,我最终不得不承认失败。
我的项目包含一个带有一些控件的功能区、一个允许用户通过 RESTful 界面搜索数据库的自定义任务窗格和一个允许他们将这些数据放入工作表中的 RTD 服务器。到目前为止,所以……嗯,很痛苦,我想:在与 Interop、ComVisibility 和 AppDomains(多么棒的主意!)进行了很多斗争之后,我目前的状态如下。
在工作表中,我像这样调用 RTD 的包装函数(截断):
Public Function call(value as String)
Dim addin as Office.ComAddIn
Set addin = Application.ComAddIns("MyAddin")
addin.Object.RTD(value)
End Function
这是(部分)插件类:
namespace Some
{
[Guid("...")]
[ComVisibleAttribute(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class MyAddin {
[snip]
public String RTD(String value)
{
String returner = null;
try
{
returner = Globals.ThisAddin.Application.WorksheetFunction.RTD(SERVERID, "", value);
}
catch(COMException ce)
{
returner = ce.StackTrace;
}
return returner;
}
}
}
以及 RTD Server 类的相关部分:
namespace Some
{
[Guid("...")]
[ComVisibleAttribute(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("MyRTDServer")]
public class Server : Excel.IRtdServer
{
[snip]
}
}
在调试模式下我:
- 创建一个空的新工作簿
- 将“=RTD(...)”公式添加到单元格
- 将包装函数调用“=call(...)”添加到单元格
- 保存工作簿
- 打开工作簿
- 停止调试并重新启动
- 打开工作簿
我观察到:
- 3点,一切正常
- 5点,一切正常
- 在 7 点,当重新计算我的单元格时,我
Unable to get the RTD property of the WorksheetFunction class
在 3) 的单元格和 2) 的单元格中出现异常#N/A
。但是,我可以看到主题已在 RTD 服务器中注册,并且一旦数据可用,异常就会被正确的数据替换。此外,如果我不重新计算单元格,它们会显示保存的值,然后在数据可用后正确更新为检索到的值。
如果处于部署模式,我观察到:
- 在 2,我得到
#N/A
- 在 3,我得到一个
Unable to get the RTD property of the WorksheetFunction class
例外
请问有什么帮助吗?:(
编辑:
在空白的 Addin 项目中使用非常基本的 RTD 服务器测试相同的过程会显示完全相同的结果:#N/A
如果在服务器获得可用数据之前重新计算 RTD 公式,则会显示加载的 excel 文件。我想问一下:WTF?
干杯,车