首页 > 解决方案 > 如何将不连续的单元格范围从 Excel 传递到 ExcelDNA 函数

问题描述

考虑这样的 ExcelDNA 函数定义:

[ExcelFunction(Name = "Fnc1", Description = "Fnc1")]
public static object Fnc1(
    [ExcelArgument(Name = "Arg1", Description = "Arg1", AllowReference = true)]
    object rng)
{
    // ...
}

有没有办法用不连续未知数量的单元格调用 ExcelDNA 函数?

我尝试过这样声明参数,params object[] rng但也没有运气。

标签: c#excelexcel-formulaexcel-dna

解决方案


为了拥有一个允许在运行时传入未知数量的参数的 Excel-DNA 函数,您需要params object[]在函数参数中使用。

public static class MyFunctions
{
    [ExcelFunction]
    public static object Hello(params object[] values)
    {
        return "Hello " + DateTime.Now;
    }
}

然后,如果您使用硬编码值调用它,=Hello(10, 20)或者如果您使用单元格引用,例如=Hello(A1,A5,A10).

但是,Excel-DNA 不支持开箱即用的可变数量的参数,因此您必须使用ExcelDna.Registration帮助程序库来注册您的函数。

安装ExcelDna.Registration NuGet 包,然后在.dna文件中,标记要使用的加载项程序集引用,ExplicitRegistration例如:

<?xml version="1.0" encoding="utf-8"?>
<DnaLibrary Name="My Add-In" (...)>
  <ExternalLibrary Path="MyAddIn.dll" ExplicitRegistration="true" (...) />
</DnaLibrary>

然后,在您的 中AutoOpen,您通过调用注册功能ProcessParamsRegistrations......例如

public class AddIn : IExcelAddIn
{
    public void AutoOpen()
    {
        ExcelRegistration
            .GetExcelFunctions()
            .ProcessParamsRegistrations()
            .RegisterFunctions();

        // ...
    }

    public void AutoClose()
    {
        // ...
    }
}

函数的隐式与显式注册

默认情况下,Excel-DNA 会搜索public static程序集中的每个方法,并将它们注册为 Excel 中的函数。这就是隐式注册过程。

ExplicitRegistration="true"关闭隐式注册因此不会自动注册任何内容——你必须自己做——这就是我在AutoOpen上面的... RegisterFunctions()调用中所做的。如果您不关闭隐式注册,那么函数最终会被注册两次(一次由隐式过程,然后再次由您的代码)并且您会收到错误消息


推荐阅读