【问题标题】:How can I ensure that an Addin / xll is 'packaged' with C# programmatically created Excel workbooks?如何确保 Addin / xll 与 C# 以编程方式创建的 Excel 工作簿“打包”?
【发布时间】:2021-06-18 18:28:56
【问题描述】:

我正忙于调试我正在制作的不断增长的 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(它的路径等)?

谢谢

【问题讨论】:

  • 谁在打开生成的 Excel 文件?您或不同 PC 上的用户团队?一种(相当老派的)方法是使用包含 VBA 包装器到 C 样式 dll(声明函数等)的基本 Excel 文件,并将该 dll 放在与文件相同的网络位置。然后将所有 Excel 文件创建为基础的修改副本。
  • 嘿。主要是用户。是的,我听到你的声音,看看它会如何工作。

标签: c# excel interop excel-addins xll


【解决方案1】:

我似乎有一个习惯,先问问题,然后再回答!

我注意到@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);

【讨论】:

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