【问题标题】:How to return a custom object or double[,] to a cell in Excel from ExcelDna?如何从 ExcelDna 将自定义对象或 double[,] 返回到 Excel 中的单元格?
【发布时间】:2012-11-02 11:55:09
【问题描述】:

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

有可能吗?

【问题讨论】:

  • 我应该先问这个问题,但是您如何使用 ExcelDNA?您只是编写函数还是直接从 C# 代码访问 Excel?这将对您传递数据的方式产生重大影响。
  • @user643192 只写函数。
  • 您要缓存的阵列有多大?没有对这种类型的单元格值的原生支持,因此您必须按照下面的建议创建某种文本序列化表示。
  • @colinfang 实际上这应该没问题。只需确保您的工作簿中有一些保留的单元格来执行输入和输出,因此您最终不会覆盖您/用户需要的数据,或者您的数据不会被篡改(或更糟的是参考范围用于存储数据的 /sheet 被删除!!)

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


【解决方案1】:

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

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

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

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

更新

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

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

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

在实践中,您尝试做的事情应该完全没有问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这就是我在 Excel 3 和纯 C XLL 时代的做法。
    • @Mike - 您可能会很高兴知道托管的 Excel-DNA .xll 加载项在 Excel '95 的所有版本上都能正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2019-08-04
    • 2017-01-29
    • 2012-10-10
    • 1970-01-01
    相关资源
    最近更新 更多