如何从ExcelDna返回自定义对象或双重[,]到Excel中的单元格?

时间:2012-11-14 00:17:28

标签: c# excel user-defined-functions excel-dna

理想情况下,我的UDF会以double [,],double []或自定义对象的形式返回一些双重结果。我希望它全部存储在Excel中的单个单元格中,然后使用另一个UDF来提取它们。它类似于缓存计算结果,并在以后按需显示。

有可能吗?

2 个答案:

答案 0 :(得分:3)

一种方法是在Excel-DNA加载项中有一个内部“对象存储”,然后有一个函数可以向Excel返回某种“句柄”,以及带有“句柄”的访问器函数'并根据需要访问对象。清理可以创建的对象是一个可能的问题,但可以使用某些RTD功能处理。

关于Excel-DNA小组的讨论有一个在F#中实现这个想法的例子 - https://groups.google.com/group/exceldna/browse_frm/thread/138bc83923701e6d

答案 1 :(得分:1)

这当然是可能的,但如果不知道如何使用ExcelDNA,很难给出详细的答案。我所知道的是,您是在vba代码中包装C#方法,还是在C#中处理Excel应用程序并直接从那里写入工作簿。 在这两种情况下,你都可以做你想做的事,但是做到这一点的方式会略有不同。包装器方法的灵活性稍差,因为你必须首先将值传递给vba UDF,然后从那里将它们写入单元格,这样你就可以限制你可以返回的数据类型(就我而言)无论如何都知道。

执行此操作的方法是将结果写入特定单元格,可能是隐藏工作表,因此无法对其进行篡改,然后使用其他UDF检索这些结果。您必须对单元格地址进行硬编码,或者解析工作表以找到所需的值。

如果方法返回double[,],您可能必须将值写入两个不同的单元格,或者在一个单元格中将文本作为带分隔符的文本写入,然后在检索单元格时将文本转换为double值,类似于Double.Parse(cell.value.ToString().Split(',')[0])来获取第一个值(假设您将值存储为逗号分隔的字符串)或类似的代码在vba中,如果您使用纯vba UDF来获取值...

如果你想这样做,我认为你肯定应该使用具有明确定义结构的隐藏表来存储你的价值观。如果您只需要存储会话持续时间的值,那么我认为您应该将它们存储在vba模块中的全局变量中。

更新

由于您只是编写函数,我认为您无法传递自定义对象(除非您实现自己的转换器,将其转换为文本然后以这种方式读回)。

您将doubledouble[,]传回UDF中的变量,并从那里将其写入单元格。然后使用任何其他UDF从该单元格再次读回来。

其余的与我上面写的相同。如果在同一单元格中存储两个值,则必须以文本形式存储,因此在将它们传递给C#方法之前,必须首先拆分和解析UDF中的值(或者可以在方法中进行解析) )。

在实践中,你应该做的事情应该没有任何问题。