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

我有一个简单的testing场景,其中包含两个单元格(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是。 有没有办法使它正确*分配C3到0?

提前致谢。

*我正确地因为我们必须实现一个Excel插件,我们的客户用它来编写电子表格,当我们在“SpreadsheetGear计算”中打开/处理电子表格时,它提供了与我们的服务器相同的“function”即上面的NaNTest()函数)。 我们用来创build加载项的库只将C2赋给#NUM! 并有两个实现(客户端插件对服务器端SpreadsheetGear)行为不同,使维护/debugging困难。

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

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

由于NaN不是有效数字,整个数组将parsing为#NUM! 代替。 其实,如果你尝试设置一个单元格的值(在自定义函数之外),比如…

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

…你会发现单元格的计算结果为#NUM! 以及。 如果这种情况可能发生在您的自定义函数中,那么您可能只需要为这个条件写一个检查,并以您的应用程序所需的任何方式进行响应。