我创建了一个简化的测试场景,其中我有一个带有两个单元格(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)的行为不同使得维护/调试变得困难。
答案 0 :(得分:1)
此行为是设计使然。请注意IValue。SetArray(...)方法文档中的注释:
如果数组中的任何数字都不是有效数字,那么结果 自定义函数将是ValueError.Num。
由于NaN不是有效数字,整个数组将解析为#NUM!代替。实际上,如果您尝试在其外部(自定义函数之外)设置单元格值,例如...
worksheet.Cells["A1"].Value = double.NaN;
...你应该发现单元格评估为#NUM!同样。如果您的自定义函数中出现此类情况,您可能只需要为此条件编写一个检查,并以您的应用程序所需的任何方式进行响应。