如何从 ExcelDna 部署 .dna 文件?

How can I deploy the .dna file from ExcelDna?

我正在尝试创建一个 Excel (2007) 加载项来响应数据透视表的更改,使用以下代码:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    Excel.Worksheet sh = this.Application.ActiveSheet;

    sh.PivotTableUpdate += new
Excel.DocEvents_PivotTableUpdateEventHandler(sh_PivotTableUpdate);
}

void sh_PivotTableUpdate(Excel.PivotTable TargetPivotTable)
{
    MessageBox.Show("sh_PivotTableUpdate event fired");
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
}

创建 .dll 后,部署 it/generating .xll 文件就成了一个挑战;我在那里使用 this post 作为指导,现在有一个 .xll 文件。

我能够将其添加到我想要响应代码的 Excel 电子表格(.xlsx 文件)(通过文件 > Excel 选项 > 加载项 > 转到.. .> 浏览),但在添加 .xll 文件时收到此错误消息:

我确实看到这里有一个 *.dna 文件 \packages\ExcelDna.AddIn.0.33.9\content\ExcelDna-Template.dna

...但制作该文件的副本并将其名称更改为 [projectName].dna (Excel2010AddInForRptRunner-AddIn.dna),然后将其复制到同一位置因为带有 .xlsx 文件的 .xll 文件不是解决方案(没有双关语)。手动更改数据透视表不会触发 event/I 看不到 "sh_PivotTableUpdate event fired" 消息。

.dna 文件确实引用了 .dll,如下所示:

<ExternalLibrary Path="Excel2010AddInForRptRunner.dll" LoadFromBytes="true" Pack="true" />

那么我需要做什么来解决收到的错误消息并让电子表格接受 .xll 文件,以便其代码 运行 并触发 PivotTableUpdate 事件处理程序?

我在您的代码段中发现了两个问题:

首先是您似乎将 VSTO Office 的东西与 Excel-DNA 混合在一起(我从 ThisAddIn_... 代码中看到这一点,它与 VSTO 相关)。这些根本不混合 - 你不能在 VSTO 加载项项目中使用 Excel-DNA。任何以 Microsoft.Office.Tools... 开头的命名空间都表示存在问题。如果您以 "Office Add-In" 或 "Excel Add-in" 作为项目类型开始,则可能会发生这种情况。

您的项目中也存在与 NuGet 包相关的问题 - 输出文件以某种方式位于包目录中,或者包目录已被覆盖或以某种方式更改。您不必在 packages\...

下编辑任何内容

如果一切正确,那么您感兴趣的文件将在您的项目目录下的 bin\Debugbin\Release 中找到。通常您只能重新分发单个 ...-AddIn-packed.xll 文件(如果需要,您也可以重命名)。

我建议您创建一个新的 "Class Library" 项目(不是 Office 加载项或类似的东西)并再次安装 ExcelDna.AddIn 程序包。然后按照弹出的 ReadMe 文件中的说明制作一个带有单个 UDF 函数的简单插件,并检查它是否运行并可以正确调试和部署。

在您完美运行之后,您可以按照以下两个步骤将 COM 对象模型的访问权限合并到您的加载项中:

  • 添加对 Excel 互操作程序集(Microsoft.Office.Interop.ExcelOffice)的引用,可以直接通过 "Add Reference",也可以通过安装 ExcelDna.Interop 来自 NuGet 的程序集。

  • 通过调用 ExcelDnaUtil.Application 获取正确的 Application 根对象。返回的对象可以转换为 Microsoft.Office.Interop.Excel.Application 并用于从那里获取整个 COM 对象模型,并连接您的事件处理程序等。