【问题标题】:Call Method of Excel COM Addin from C#C#中Excel COM Addin的调用方法
【发布时间】:2017-09-10 00:45:57
【问题描述】:

我的 Excel 可以通过插件从数据提供者下载数据。 从提供者的帮助页面中,我发现(并测试)可以通过在 VBA 中调用以下命令来“刷新”数据:

Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.RefreshWorkbook

在互联网上搜索了几个小时后,我找不到关于如何使用 C# 调用完全相同的方法的答案。

由于我有许多需要定期更新的电子表格,我正在尝试自动化该过程。

  1. 可能实现此目的的一种方法是在每次使用上述命令打开电子表格并调用它时注入一个新宏,但如果可能的话,我更喜欢直接使用 C# 调用它。
  2. 第二种解决方案是使用 Python 或其他语言 以 CSV 格式下载数据并将我的电子表格链接到 CSV 但这个过程似乎也有点矫枉过正。

非常感谢。

【问题讨论】:

  • 动态 obj = 应用程序...对象; obj.Whatever();
  • 谢谢你。我现在已经根据你的例子改变了我的代码。 dynamic obj = Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object 但是当我尝试运行 obj.RefreshWorkbook() 它说该方法不存在。有什么想法吗?
  • 我最终找到了一个解决方法:通过 C# 以编程方式在 VBA 模块中插入(注入)一个 Sub 过程,然后调用上面的代码。使用此解决方案时遇到的问题是,有时在尝试运行宏时出现错误 438。我在打开 Excel 后使用System.Threading.Thread.Sleep(10000); 设法摆脱它,这意味着我收到错误是因为可能当我想运行 VBA 代码时,没有加载 COM 插件。所以,现在的问题变成了:“在我尝试访问它们之前,如何确保 Excel 中的所有插件都已加载”?
  • 嗯,奇怪,真是个错误。我想你可以通过在第一次尝试时嗅探对象来破解它。最好是一个简单的无操作属性,在一个循环中,捕获异常并延迟一百毫秒,并在每次尝试后增加延迟。不要永远循环。
  • Bug 在哪一边? Excel 还是 COM 插件? “第一次尝试嗅探对象”是什么意思。?你能详细说明一下吗?我非常感谢任何帮助。

标签: c# excel vba office-interop com-interop


【解决方案1】:

您可以使用后期投标技术(.net 中的反射)来调用方法和属性,而无需将对象强制转换为实际类型,请参阅Type.InvokeMember 了解更多信息。

 Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.GetType().InvokeMember("RefreshWorkbook" ...

您也可能会发现HowTo: Communicate with a COM add-in from a standalone application 文章很有帮助。包含 C# 中的示例代码。

【讨论】:

  • 我无法从插件的 Object 中获取自定义 COM 接口,但我可以通过反射调用各个方法。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2014-12-17
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多