我如何确保 Addin / xll 是 'packaged',C# 以编程方式创建 Excel 工作簿?

How can I ensure that an Addin / xll is 'packaged' with C# programmatically created Excel workbooks?

我正忙于调试我正在制作的不断增长的 C# Windows 服务。

确实如此:

  1. 后台读取 SQL 服务器数据库并接收 'jobs'。
  2. 作业是 XML(1..n 个报告,包含 1..n 个选项卡,包含 1..n 个数据透视表,包含 1..n where/slicers、1..n 个度量、1.. .n 维)
  3. 然后 C# 遍历这些 XML 个作业并创建 Excel 个工作簿。

注意:枢轴实际上是对我的自定义 xll/dll 的调用,用于与我的远程 Java ActivePivot 多维数据集通信。

Excel 工作簿正在保存到网络共享中,并且公式作为数组函数(.FormulaArray = 等)很好地嵌入。

我试过 .RegisterXLL 等,但我认为这并没有真正将它添加到我想要的地方。

我是否需要以编程方式添加 VBA OnOpen 样式代码,如下所示: Is there a way to add vba macro code to excel?

或者是否有更好的现代 C# 方法来确保 ref/link 到 XLL/DLL(它的路径等)?

谢谢

我好像有先问后答的习惯!

我注意到@DS_London的建议,但在尝试之前,我实际上查看了我在问题中引用的link(关于注入VBA)。

所以下面的代码构造了一个代表 VBA 函数的字符串(所以你必须把它写成一个有效的 VBA 函数)。在任何情况下,即使它有错误,VBA 调试器也会为您抛出这些错误,这样您就可以调试它们,因为一旦它运行,您就会进入 VBA 状态。请注意使用 .VBProject,Visual Studio 会给您红色错误,因此您可以选择添加正确的导入。

在没有 C# 方法的情况下 found/obvious 我做了这个并且它有效。我的 XLL 中的函数在 C# 编程生成的工作簿中是 seen/usable。我打开它时必须手动启用security/macros并手动刷新功能(我正在考虑解决这个问题的方法):

var codeText = "Private Sub Workbook_Open()\r\n";
codeText += "  Dim ourAddin As Object" + "\r\n"; 
codeText += "  Application.RegisterXLL (\"" + addin + "\")" + "\r\n";
codeText += "  Set ourAddin = Application.AddIns.Add(\"" + addin + "\",True)" + "\r\n";
codeText += " ourAddin.Installed = True" + "\r\n";
codeText += "End Sub";
var workbookMainModule = workbook.VBProject.VBComponents.Item("ThisWorkbook");
workbookMainModule.CodeModule.AddFromString(codeText);