如何确保使用 C# 以编程方式创建的 Excel 工作簿“打包”了 Addin/xll?

问题描述

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

确实如此:

  1. 后台读取 sql Server 数据库并接收“作业”。
  2. 作业是 XML(1..n 个报告包含 1..n 个选项卡,其中包含 1..n 个数据透视表,其中包含 1..n 个位置/切片器、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# 方法来确保引用/链接到 XLL/DLL(它的路径等)?

谢谢

解决方法

我似乎有一个习惯,就是先提问,过段时间再回答!

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

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

没有找到 C# 方法/显然我这样做了并且它有效。我的 XLL 中的函数在 C# 以编程方式生成的工作簿中可见/可用。我必须在打开它时手动启用安全性/宏并手动刷新该功能(我正在考虑解决此问题的方法):

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);