当存在 double.NaN 时,SpreadsheetGear SetArray 为 double

SpreadsheetGear SetArray of double when double.NaN is present

我创建了一个简化的测试场景,其中我有一个包含两个单元格 (C2/C3) 且具有数组公式的电子表格:

{=NaNTest()}

我简化的CustomFunction如下:

public class NaNTest : CustomFunctions.Function
{
    public NaNTest() : this( "NaNTest" ) { }
    public NaNTest( string name ) : base( name, CustomFunctions.Volatility.Invariant, CustomFunctions.ValueType.Variant ) { }

    public override void Evaluate( CustomFunctions.IArguments a, CustomFunctions.IValue r )
    {
        var result = new double[ 1, 2 ];
        result[ 0, 0 ] = double.NaN;
        result[ 0, 1 ] = 0d;
        r.SetArray( result );
    }
}

这会将 C2 和 C3 都设置为 #NUM!,而我希望 C2 为 only。有没有办法让它正确*将C3赋值给0?

提前致谢。

* 我说 正确 因为我们必须实施一个 Excel 插件,我们的客户使用它来制作电子表格,它提供与 'functionality' 相同的 'functionality'当我们 open/process 我们 'SpreadsheetGear calculations' 中的电子表格(即上面的 NaNTest() 函数)时,我们在 'our servers' 上提供。我们用来创建加载项的库仅将 C2 分配给 #NUM!并且让两种实现(客户端加载项与服务器端 SpreadsheetGear)表现不同使得 maintenance/debugging 困难。

此行为是设计使然。请注意 IValue.SetArray(...) 方法文档中的注释:

If any of the numbers in the array are not valid numbers, the result of the custom function will be ValueError.Num.

由于 NaN 不是有效数字,因此整个数组将解析为 #NUM!反而。实际上,如果您尝试在其外部(自定义函数之外)设置单元格值,例如...

worksheet.Cells["A1"].Value = double.NaN;

...您应该会发现该单元格的计算结果为 #NUM!以及。如果您的自定义函数中可能会出现此类情况,您可能只需要针对这种情况编写检查并以您的应用程序所需的任何方式做出响应。