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

时间:2015-04-27 02:48:42

标签: excel nan spreadsheetgear

我创建了一个简化的测试场景,其中我有一个带有两个单元格(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时,这会将C2和C3设置为 #NUM!。有没有办法正确使用*将C3指定为0?

提前致谢。

*我说正确因为我们必须实现客户用来创建电子表格的Excel加载项,并且它提供了我们在打开时在“我们的服务器”上提供的相同“功能”/在我们的'SpreadsheetGear计算'中处理电子表格(即上面的NaNTest()函数)。我们用来创建加载项的库只将C2分配给#NUM!并且这两种实现(客户端加载项与服务器端SpreadsheetGear)的行为不同使得维护/调试变得困难。

1 个答案:

答案 0 :(得分:1)

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

  

如果数组中的任何数字都不是有效数字,那么结果   自定义函数将是ValueError.Num。

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

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

...你应该发现单元格评估为#NUM!同样。如果您的自定义函数中出现此类情况,您可能只需要为此条件编写一个检查,并以您的应用程序所需的任何方式进行响应。