【发布时间】:2011-11-09 18:00:23
【问题描述】:
在 Excel 2007 的 c# UDF 中,我需要评估 Excel 函数参数的值(不要问为什么,长篇大论)。
假设我们要评估这个 Excel 函数:
=afunctionname("2009-01-01" ; "B4" ; "foo" ; concatenate("a";"b") )
我的目标是得到一个字符串:
=afunctionname("2009-01-01" ; "B4 单元格的值" ; "foo" ; "ab" )
感谢这个 sn-p,我评估了参数的值:
Object comObject = app.Evaluate(param); //app = Microsoft.Office.Interop.Excel.Application
String value = getValueFromComObject(comObject);
getValueFromComObject 详细信息:
private static String getValueFromComObject(Object comObject) {
if ((comObject as Range) != null)
{
Range rge = ((Range)comObject);
switch (Type.GetTypeCode(rge.Value.GetType()))
{
case TypeCode.DateTime:
return ((DateTime)rge.Value).ToShortDateString();
default:
return rge.Value.ToString().Trim();
}
}
else
{
return comObject.ToString();
}
}
我们示例的第一个和第三个参数直接通过 application.Evaluate 返回为 String 。第二个参数作为一个范围返回,并且由于类型转换而得到正确管理。
问题出在第四个参数上,我不知道我必须在评估连接函数时应用的女巫类型,它显然不是一个范围,toString() 给了我参考:-2146826273
有什么想法吗?
【问题讨论】:
-
不确定 C# 但在 VB 中您可以使用 TypeName 或 .GetType.ToString(或类似的东西)来确定它是什么类型的对象。
-
这是错误代码 2015,“类型不匹配”。可能与尝试将函数转换为字符串有关,不确定。
-
在 VBA 中
typename(application.Evaluate("concatenate(""a"",""b"")"))给出“字符串”。我不知道为什么您的 app.evaluate 不会给出类似的结果... -
Evaluate 有很多怪癖:您可能会发现这篇博文很有用 fastexcel.wordpress.com/2011/11/02/…
标签: c# excel function vsto evaluate