我了解如何在 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/