如何将自定义对象或double 从ExcelDna返回到Excel中的单元格?
理想情况下,我的UDF将以double [,],double []的forms或作为自定义对象返回一些双重结果。 我希望它被全部存储在Excel中的一个单元格中,然后使用另一个UDF来提取它们。 它类似于caching计算的结果,并在以后按需显示。
可能吗?
一种方法是在你的Excel-DNA加载项中有一个内部的“对象存储”,然后有一个函数返回Excel的某种“句柄”,以及访问函数,该函数使用“句柄”和访问对象按要求。 清理可以创build的对象是一个可能的问题,但是可以使用一些RTDfunction来处理。
关于Excel-DNA小组的讨论有一个在F#中实现这个想法的例子 – https://groups.google.com/group/exceldna/browse_frm/thread/138bc83923701e6d 。
这当然是可能的,但如果不知道如何使用ExcelDNA,很难给出详细的答案。 我所知道的是,不pipe你是用vba代码包装你的C#方法还是用C#处理Excel应用程序,直接从那里写入工作簿。 在这两种情况下,你都可以做你想做的事情,但是做的方式会稍有不同。 包装器方法也会稍微不灵活,因为你必须首先将你的值传递给vba UDF,然后把它们写入到单元格中,这样你将被限制在你可以返回的数据types中(就我而言无论如何知道)。
这样做的方法是将结果写入特定的单元格,也许在一个隐藏的表格,所以它不能被篡改,然后检索那些使用另一个UDF。 你将不得不硬编码的单元格地址,或者可能parsing工作表来find你想要的值。
如果方法返回double[,]
,则可能必须将值写入两个不同的单元格,或者在一个单元格中使用分隔符作为文本,然后在检索单元格值时从文本转换为double Double.Parse(cell.value.ToString().Split(',')[0])
来获取第一个值(假设您将值存储为逗号分隔的string)或类似的代码一个纯粹的VBA UDF获取值…
如果你想这样做,我认为你应该使用隐藏的表单结构明确的存储你的价值观。 如果您只需要存储会话持续时间的值,那么我认为您应该将它们存储在vba模块中的全局variables中。
UPDATE
既然你只是写函数,我不认为你将能够传递一个自定义的对象(除非你实现自己的转换器,将其转换为文本,然后读回来的方式)。
您将double
或double[,]
传回UDF中的variables,并将其写入单元格中。 然后用任何其他UDF从该单元格再次读取它。
其余的和我上面写的一样。 如果将两个值存储在同一个单元格中,则必须将其作为文本执行,因此在将它们传递到C#方法之前,必须首先在UDF中拆分和parsing值(或者可以在方法中进行parsing)。
在实践中,你所要做的事情应该没有任何问题。