如何从ExcelDna部署.dna文件?

时间:2016-10-31 22:26:34

标签: pivot-table excel-interop office-addins excel-addins excel-dna

我正在尝试创建一个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后,部署它/生成.xll文件成为一项挑战;我在那里使用this post作为指导,现在有一个.xll文件。

我能够将其添加到我要回复代码的Excel电子表格(.xlsx文件)中(通过文件> Excel选项>加载项> Go ...>浏览),但是在添加.xll文件时得到这个错误消息:

enter image description here

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我在您的代码段中看到了两个问题:

首先,您似乎已将VSTO Office内容与Excel-DNA混合在一起(我在ThisAddIn_...代码中看到了这与VSTO相关的代码)。这些根本不混合 - 您无法在VSTO加载项目中使用Excel-DNA。以Microsoft.Office.Tools...开头的任何名称空间都表示存在问题。这可能发生在你开始使用&#34; Office Add-In&#34;或者&#34; Excel加载项&#34;作为您的项目类型。

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

下编辑任何内容

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

我建议你制作一个新的&#34;类库&#34;项目(不是Office加载项或类似的东西)并再次安装ExcelDna.AddIn包。然后按照弹出的自述文件中的说明使用单个UDF函数创建一个简单的加载项,并检查它是否运行并且可以正确调试和部署。

在完美地运行之后,您可以通过以下两个步骤将COM对象模型访问到您的加载项中:

  • 添加对Excel Interop程序集(Microsoft.Office.Interop.ExcelOffice)的引用,可以直接通过&#34; Add Reference&#34;或者安装ExcelDna.Interop程序集来自的NuGet。

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