无法以编程方式加载xll
我试图自动化一些Excel加载项的testing,这是在xllforms。 我在加载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。 当我通过录制macros手动加载xll时,我试着看看Excel暗中做了什么。 macros看起来像:
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。
是的,ChDir命令可能很重要。 它可以帮助Windowsfind任何依赖于.x的DLL。 它不能解决您的问题的原因是FileSystem.ChDir()更改testing程序的工作目录,而不是Excel。
不是你可以做的全部的事情。 部署xll会做一个在系统PATH上的目录来解决这个问题。 一个实用的解决scheme就是运行这个macros。
我知道这不是直接回答你的问题,但你可能想看看在Visual Studio中使用VSTO。 VSTO将这些types的问题自动化。 VS 2010中的版本比以前好多了,你可以构build应用程序级插件,而不仅仅是文档级加载项。 如果您需要用户定义的函数,您可以使用如下所述的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用于用户定义的function。 有什么好的是,他们被加载在同一个应用程序域,所以他们可以相互交谈。
感谢所有的build议。
我通过更改Excel应用程序的默认文件path来解决问题。
Application.xlApp = new ApplicationClass(); xlApp.DefaultFilePath = "C:\\SomePath"; xlApp.RegisterXLL("Whatever.xll");
我遇到了在VBA代码中加载用户定义函数[UDF]的问题。 能够加载xll文件,但无法调用。
以下代码成功加载XLL文件,并从VBA代码中调用用户定义的函数。 在这个模块中可能会有redudendent指令,但是它可以工作!
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
一个适当的解决办法是:
1-保存当前目录
string CurrentDir = Directory.GetCurrentDirectory()
2-然后你使用
Directory.SetCurrentDirectory(dirXll);
其中dirXll是你的xll的位置(参见GetExecutingAssembly())。
3-加载你的xll(RegisterXLL)
4-最后使用CurrentDir将当前目录设置回原来的位置。
不要忘记添加所有你xll是在你的xll相同的文件夹依赖的DLL。