我理解如何在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;
}
答案 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下拉列表中显示您的功能,那么我就没有想法。