C# 如何从ExcelDna将自定义对象或双精度[,]返回Excel中的单元格?

C# 如何从ExcelDna将自定义对象或双精度[,]返回Excel中的单元格?,c#,excel,user-defined-functions,excel-dna,C#,Excel,User Defined Functions,Excel Dna,理想情况下,我的UDF将以double[,]和double[]的形式或作为自定义对象返回一些双重结果。我想它是所有存储在一个单元格中的Excel,然后使用另一个自定义项提取它们。它类似于缓存计算结果并在以后需要时显示 有可能吗?当然有可能,但在不知道如何使用ExcelDNA的情况下,很难给出详细的答案。我的意思是,您是在用vba代码包装C方法,还是在用C获得Excel应用程序的句柄并直接从那里写入工作簿。 在这两种情况下,你都可以做你想做的事情,但是做的方式会略有不同。包装器方法的灵活性也会稍差

理想情况下,我的UDF将以double[,]和double[]的形式或作为自定义对象返回一些双重结果。我想它是所有存储在一个单元格中的Excel,然后使用另一个自定义项提取它们。它类似于缓存计算结果并在以后需要时显示


有可能吗?

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

这样做的方法是将结果写入一个特定的单元格,可能在一个隐藏的工作表上,这样它就不能被篡改,然后使用另一个UDF检索这些结果。您必须硬编码单元格地址,或者解析工作表以找到所需的值

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

如果你想这样做,我认为你一定应该使用一个隐藏的表和一个定义良好的结构来存储你的值。如果只需要在会话期间存储这些值,那么我认为应该将它们存储在vba模块中的全局变量中

更新

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

将double或double[,]传递回UDF中的变量,然后将其写入单元格。然后用任何其他UDF从该单元格中再次读取

剩下的和我上面写的一样。如果在同一个单元格中存储两个值,则必须以文本的形式进行,因此必须先在UDF中拆分和解析值,然后再将它们传递给C方法,或者可以在方法中进行解析


实际上,您尝试做的事情应该没有任何问题。

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

这样做的方法是将结果写入一个特定的单元格,可能在一个隐藏的工作表上,这样它就不能被篡改,然后使用另一个UDF检索这些结果。您必须硬编码单元格地址,或者解析工作表以找到所需的值

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

如果你想这样做,我认为你一定应该使用一个隐藏的表和一个定义良好的结构来存储你的值。如果只需要在会话期间存储这些值,那么我认为应该将它们存储在vba模块中的全局变量中

更新

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

将double或double[,]传递回UDF中的变量,然后将其写入单元格。然后用任何其他UDF从该单元格中再次读取

剩下的和我上面写的一样。如果在同一个单元格中存储两个值,则必须将其作为文本进行存储,因此必须先在UDF中拆分和解析这些值,然后再将它们传递给CM 或者您可以在方法中进行解析


实际上,您尝试执行的操作应该没有任何问题。

一种方法是在外接程序中有一个内部“对象存储”,然后有一个函数将某种类型的“句柄”返回Excel,以及访问器函数,这些函数接受“句柄”并根据需要访问对象。清理您可以创建的对象是一个可能的问题,但是可以使用RTD的一些功能来处理


有关Excel DNA组的讨论中有一个在F-中实现此想法的示例。一种方法是在外接程序中有一个内部“对象存储”,然后有一个函数将某种“句柄”返回Excel,以及访问器函数,这些函数接受“句柄”并根据需要访问对象。清理您可以创建的对象是一个可能的问题,但是可以使用RTD的一些功能来处理


关于Excel DNA组的讨论中有一个在F-中实现此想法的示例。

我应该先问这个问题,但是您如何使用Excel DNA?您只是在编写函数,还是直接从C代码访问Excel?这将对您传递数据的方式产生很大的影响。@user643192只需编写函数。要缓存的数组有多大?这种类型的单元格值没有本机支持,因此您必须按照下面的建议创建某种文本序列化表示形式。@colinfang实际上,这应该没有问题。只需确保您的工作簿中有一些保留单元格来执行输入和输出,这样您就不会覆盖您/用户需要的数据,或者您的数据不会被篡改,或者更糟糕的是,您用来存储数据的参考范围/表会被删除!!我应该先问这个,但你是如何使用ExcelDNA的?您只是在编写函数,还是直接从C代码访问Excel?这将对您传递数据的方式产生很大的影响。@user643192只需编写函数。要缓存的数组有多大?这种类型的单元格值没有本机支持,因此您必须按照下面的建议创建某种文本序列化表示形式。@colinfang实际上,这应该没有问题。只需确保您的工作簿中有一些保留单元格来执行输入和输出,这样您就不会覆盖您/用户需要的数据,或者您的数据不会被篡改,或者更糟糕的是,您用来存储数据的参考范围/表会被删除!!这就是我在Excel 3和straight C xll时代所做的。@Mike-你可能会很高兴知道托管Excel DNA.xll加载项在Excel'95的所有版本上都能很好地工作。这就是我在Excel 3和straight C xll时代所做的。@Mike-你可能会很高兴知道托管Excel DNA.xll加载项工作得很好在所有版本上返回Excel'95。