【问题标题】:Can't load xll programmatically无法以编程方式加载 xll
【发布时间】:2011-03-12 21:49:43
【问题描述】:

我正在尝试对 xll 格式的 Excel 加载项自动执行一些测试。我在加载 xll 时遇到了一些问题。我正在用 C# 编写它,我的代码如下所示:


using Microsoft.Office.Interop.Excel;

Application xlApp;
Workbook xlWorkBook;
Worksheet xlWorkSheet;

// create application, open workbook, etc ...
// now try to register xll
xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll");

但是,这总是返回 false。当我通过录制宏手动加载 xll 时,我尝试查看 Excel 偷偷做了什么。宏看起来像:


Sub Macro1()
ChDir "C:\SomePath"
Application.RegisterXLL Filename:= _
"C:\SomePath\Whatever.xll"
End Sub

唯一的区别似乎是 ChDir,所以我将代码更改为:


FileSystem.ChDir("C:\\SomePath");
xlApp.RegisterXLL("C:\\SomePath\\Whatever.xll");

但它仍然不起作用。另一个奇怪的事情是,当我在 RegisterXLL 行之前放置一个断点并首先手动加载 xll 时,RegisterXLL 方法将返回 true。但否则,它将返回 false。

【问题讨论】:

    标签: c# .net excel vba xll


    【解决方案1】:

    感谢所有建议。

    我通过更改 Excel 应用程序的默认文件路径解决了这个问题。

    Application.xlApp = new ApplicationClass();
    xlApp.DefaultFilePath = "C:\\SomePath";
    xlApp.RegisterXLL("Whatever.xll");
    

    【讨论】:

      【解决方案2】:

      是的,ChDir 命令可能很重要。它可以帮助 Windows 找到whatever.xll 所依赖的任何DLL。它不能解决您的问题的原因是 FileSystem.ChDir() 更改了 您的 测试程序的工作目录,而不是 Excel。

      不是你能做到的。部署 xll 执行系统 ​​PATH 上的目录将解决它。一个实用的解决方案是只运行该宏。

      【讨论】:

        【解决方案3】:

        我知道这不是对您问题的直接回答,但您可能希望了解在 Visual Studio 中使用 VSTO。 VSTO 自动化了许多此类问题。 VS 2010 中的版本比以前的版本要好得多,您可以构建应用程序级别的插件,而不仅仅是文档级别的插件。如果您需要用户定义的函数,您可以使用此处所述的 COM 插件:

        http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx

        最初是基于这篇文章:

        http://blogs.msdn.com/eric_carter/archive/2004/12/01/273127.aspx

        我们将 VSTO 组合用于我们的主应用程序,并将 COM 插件用于用户定义的功能。这样做的好处是它们被加载到同一个应用程序域中,因此它们可以相互交谈。

        【讨论】:

        • 嘿 Erick,我想知道您能否解释一下如何将托管自动化加载项填充到与 VSTO 相同的 AppDomain 中?听起来很酷。
        • 迈克,其实我不知道为什么会这样。我们曾经使用远程处理,这导致尝试将应用程序与终端服务一起使用时出现问题。我们会检查 COM 插件是否已注册,如果未注册,请使用 Regasm.exe。如果您检查每个 (AppDomain.CurrentDomain.FriendlyName) 的应用程序域,那么您应该会看到它(我们的是“PrevisionAddIn.vsto”)。我们使用具有引用 Excel 实例的属性的全局类和指向主代码的 UDF 接口。 COM UDF 类实际上是将调用传递给主代码的外壳程序。请注意,这是使用 VS 2010 和 Excel 2007。
        • 谢谢埃里克,这很有趣。我已经用无填充的解决方案做了这种事情。我不知道如果你这样做,他们会同时使用同一个 AppDomain。很高兴知道这一点,谢谢!
        【解决方案4】:

        适当的解决方案是:

        1- 用

        保存当前目录
         string CurrentDir =   Directory.GetCurrentDirectory()
        

        2- 然后你使用

          Directory.SetCurrentDirectory(dirXll);
        

        dirXll 是您的 xll 的位置(参见 GetExecutingAssembly())。

        3- 加载你的 xll (RegisterXLL)

        4- 最后使用 CurrentDir 将当前目录设置回其原始位置。

        不要忘记将您 xll 所依赖的所有 dll 添加到与您的 xll 相同的文件夹中。

        【讨论】:

          【解决方案5】:

          我遇到了在 VBA 代码中加载用户定义函数 [UDF] 的问题。能够加载 xll 文件但无法调用。

          以下代码成功加载 XLL 文件,让我们从 VBA 代码中调用用户定义的函数。该模块中可能有reducendent指令,但它有效!

          Sub InstallAddIn()
          
          On Error GoTo ErrorHandle
          
          Application.DefaultFilePath = "D:\\MyFolder"
          
          Application.RegisterXLL ("MyXLLFileName.xll")
          
          Set AI = AddIns.Add(Filename:="D:\MyFolder\MyXLLFileName.xll")
          
              If AddIns("MyXLLFileName").Installed Then
                 LogInformation ("My XLL is installed")
              Else
                 LogInformation ("My XLL is NOT installed")
              End If
          Exit Sub
          
          ErrorHandle:
          
          LogInformation ("------------------------") 'Logging function that I have written. Not a std api
          
          LogInformation (Err.HelpFile)
          
          LogInformation (Err.HelpContext)
          
          LogInformation (Err.Description)
          
          LogInformation ("Error in InstallAddIn module")
          
          LogInformation ("------------------------")
          
          End
          
          End Sub
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-12-02
            相关资源
            最近更新 更多