VSTO Excel插件中Evaluate返回System.Object[*]的处理疑问
关于VSTO Excel加载项中Evaluate返回System.Object[*]的问题解答
1. System.Object[*]是什么?
这是.NET中一维非零下限数组的类型表示,在与Excel COM对象交互时很常见。当你用Evaluate调用UNIQUE(A1:A20)且目标区域为空时,Excel公式实际会返回#CALC!错误(因为没有可提取的唯一值),此时Evaluate会将这个错误结果包装成这种特殊的一维数组返回,数组内的单个元素对应Excel的错误枚举值(如XlError.xlErrCalc)。
2. 如何转换并得到预期结果?
你可以通过以下两种方式处理:
方式一:通过代码判断数组类型并处理错误
先区分返回结果的数组类型,将特殊一维数组转换为常规数组后,识别Excel错误值并返回预期结果:
Excel.Application app = Globals.ThisAddIn.Application; object result = app.Evaluate("=UNIQUE(A1:A20)"); if (result is System.Array array) { // 处理非空区域返回的二维数组 if (array.Rank == 2) { object[,] uniqueValues = (object[,])array; // 后续对正常结果的处理逻辑 } // 处理空区域返回的一维非零下限数组 else if (array.Rank == 1) { object[] flatArray = array.Cast<object>().ToArray(); if (flatArray.Length > 0 && flatArray[0] is Excel.XlError error) { if (error == Excel.XlError.xlErrCalc) { // 空区域场景返回0 Debug.WriteLine(0); } } } }
方式二:直接修改公式避免类型判断
用IFERROR包装原公式,让空区域时直接返回0,无需额外转换:
object result = app.Evaluate("=IFERROR(UNIQUE(A1:A20),0)");
这种方式下,空区域时Evaluate会直接返回0(类型为double),非空区域则返回正常的二维数组。
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

