我编写了一个 OpenOffice / LibreOffice 插件,它在 Java 中实现了一些自定义 Calc 电子表格函数。其中一些函数创建 Java 对象,然后这些对象在逻辑上与函数的结果相关联,因此也与使用该函数的单元格相关联。
(现在假设函数是从单元格公式调用的,而不是从函数向导或其他上下文中调用的)。
OpenOffice 不会告诉自定义函数它们是从哪个单元格调用的,因此要弄清楚这种关联并不容易。如果函数的参数是单元格地址,则可以查看这些单元格并找到依赖于它们的单元格 - 这缩小了可能性。
如果它是一个字符串,则可以在结果中包含 Java 对象的唯一键,但这很难看。然后我可以定期扫描所有单元格以确保唯一密钥仍然存在于一个或多个单元格中。
但是,该函数也可以嵌套在公式中的其他函数中,因此不能保证该键最终会在单元格的结果值中可见。
我正在寻找一种干净的方法来检测对对象的逻辑引用已经消失(因为函数的实例是用不同的参数调用的,或者包含函数的公式已被删除或更改)。
编辑:返回 XVolatileResult 看起来很有希望,但是删除公式时永远不会调用 removeResultListener() 回调(文档关闭时除外)。
更多说明:自定义函数作为 Uno 组件的实例方法实现(单个组件上可能有多个自定义函数)。只创建了一个组件实例。
函数方法使用字符串或数字参数调用,对应于电子表格公式中的参数。也可以将 args 作为单元格引用而不是值接收。
函数的结果是字符串或数值或 XVolatileResult。不可能返回任意 Java 对象。
我正在创建 Java 对象作为评估函数的副作用,并且我希望能够在其他单元格的其他公式中引用这些对象。