Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C调用Excel COM加载项的方法#_C#_Excel_Vba_Office Interop_Com Interop - Fatal编程技术网

C# 从C调用Excel COM加载项的方法#

C# 从C调用Excel COM加载项的方法#,c#,excel,vba,office-interop,com-interop,C#,Excel,Vba,Office Interop,Com Interop,我的Excel可以通过加载项从数据提供程序下载数据。 从提供程序的帮助页面中,我发现(并测试)可以通过在VBA中调用以下命令来“刷新”数据: Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.RefreshWorkbook 在花了几个小时在互联网上搜索之后,我找不到一个关于如何使用C#调用完全相同的方法的答案 由于我有许多这样的电子表格需要定期更新,我正在尝试自动化这个过程 实现这一点的一种方法可能是,每次我用上述命令打开电子

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

Application.COMAddIns("PowerlinkCOMAddIn.COMAddIn").Object.RefreshWorkbook
在花了几个小时在互联网上搜索之后,我找不到一个关于如何使用C#调用完全相同的方法的答案

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

  • 实现这一点的一种方法可能是,每次我用上述命令打开电子表格并调用它时,都注入一个新宏,但如果可能的话,我更愿意直接用C#调用它
  • 第二种解决方案是使用Python或其他语言 下载CSV格式的数据,并将我的电子表格链接到CSV 但这一过程似乎也有些过火

  • 非常感谢。

    您可以使用后期出价技术(在.net中反射)来调用方法和属性,而无需将对象强制转换为实际类型,有关详细信息,请参阅

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

    你也会发现这篇文章很有帮助。其中包括一个C#中的示例代码

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