如何在F#中编写一个可以从Excel调用的函数,它将一个范围作为输入并将数组输出到ssheet中?

时间:2017-02-21 11:44:04

标签: arrays f# excel-formula excel-addins excel-dna

我理解如何在C#中执行此操作,我可以使用Excel DNA创建AddIns。我无法弄清楚F#语法来启用函数f,为了简单起见,它执行类似f(x)=维度[2,2]的2D数组,包含所有4个值的x。所以我从excel中调用f从单元格中获取输入,它将返回2x2数组。 (我将在这里做更复杂的事情 - 但如果我能理解那个简单的情况,我会没事的)。非常感谢!

我创建F#函数的尝试如下所示:

let array2D : int [,] = Array2D.zeroCreate 20 20
let g x = array2D

我遇到的问题是,这不会在xla名称下的excel下拉列表中显示为函数。

使用C#示例:

public static double[,] arraytoexcel(int N) 
{ 
    double[,] RetArray = new double[N, N]; 
    for (int i = 0; i < N; i++) { 
        for (int j = 0; j < N; j++) { 
            RetArray[i, j] = N; 
        } 
    } 
    return RetArray; 
}

1 个答案:

答案 0 :(得分:3)

你可能想要这样的东西:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need

let mkArray size = Array2D.init size size (calculateCellContents size)

请注意calculateCellContents返回 float (C#double的F#名称),而不是int。您的C#示例使函数返回double值的数组,如果XLA正在查找具有该签名的函数(返回浮点数组),那么这可能是它未显示的一个可能原因

现在,如果没有解决问题,那么这并不会在excel下拉列表中显示为一个函数&#34;问题,我还有其他两种可能性。首先,如果您应该在Excel下拉列表的函数上设置属性以便能够找到它,则语法为[<AttributeName>]。 E.g:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need

[<ExcelFunction(Description="Make a simple array")>]
let mkArray size = Array2D.init size size (calculateCellContents size)

其次,可能是您必须更改功能的类型。 F#函数的类型为FSharpFunc,XLA完全有可能寻找Func而不是FSharpFunc。您可以通过从F#函数创建新的System.Func对象来进行转换:

let calculateCellContents size x y = float (y * size + x) // Whatever math you need

let mkArray size = Array2D.init size size (calculateCellContents size)

let mkArrayVisibleFromExcel = new System.Func<int,float>(mkArray)

或者可能:

[<ExcelFunction(Description="Make a simple array")>]
let mkArrayVisibleFromExcel = new System.Func<int,float>(mkArray)

如果这不起作用,请尝试更改mkArray以获取float参数,并相应地将呼叫更改为Array2D.init

let calculateCellContents sizeF x y = float y * sizeF + float x // Whatever math you need

let mkArray (sizeF:float) = 
    Array2D.init (int sizeF) (int sizeF) (calculateCellContents sizeF)

[<ExcelFunction(Description="Make a simple array")>]
let mkArrayVisibleFromExcel = new System.Func<float,float>(mkArray)

如果这些都不能在Excel的XLA下拉列表中显示您的功能,那么我就没有想法。