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

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

我了解如何在 C# 中执行此操作,并且可以使用 Excel DNA 创建 AddIn。我无法弄清楚启用函数 f 的 F# 语法,为了简单起见,该函数执行类似 f(x)= 维度 [2,2] 的二维数组(包含所有 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; 
}

最佳答案

你可能想要这样的东西:

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# 的 F# 名称 double ),而不是 int。您的 C# 示例的函数返回 double 数组值,如果 XLA 正在寻找具有该签名的函数(返回 float 数组),那么这可能是它不显示的一个可能原因。

现在,如果这不能解决“这不会在 Excel 下拉列表中显示为函数”问题,那么我想到了另外两种可能性。首先,如果您要在函数上设置一个属性,以便 Excel 下拉列表能够找到它,则语法为 [<AttributeName>] 。例如:

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 。您可以通过创建新的 System.Func 在它们之间进行转换。来自 F# 函数的对象:

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 下拉列表中可见,那么我就没有主意了。

关于arrays - 如何在 F# 中编写一个可以从 Excel 调用的函数,该函数将一个范围作为输入并将数组输出到工作表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42366383/

相关文章:

javascript - 如何使用 javascript 附加到此数组

javascript - 多维矩阵上的每元素数组运算

F# 静态成员

excel - 如何通过变量引用Excel工作表

excel - 在 SUBTOTAL 中嵌套 SUMIFS

coldfusion - Apache poi edate 公式没有实现?

javascript - 循环内的逻辑在 ReactJs 上不起作用

python - Numpy C-Api 将顺序从列更改为行

f# - 通过 F# 的交互窗口添加引用

c# - 从 F# 使用 C# 事件