问题描述
我为此问题苦苦挣扎了一段时间,但我无法在线找到任何解决方案。我最接近的是如何编写可在 Calc 公式中使用的 Basic 函数,但由于 Basic 和 BeanShell 是完全不同的语言,我找不到正确的语法/过程来实现后一种语言中的相同功能。
在 Writer 中,您可以有一个表格(不是电子表格——只是普通表格),您可以在其中按 F2 在单元格上并输入一些公式,例如=<C2>*<E2>
计算 C2 和 E2 单元格中值的乘积。
我编写了 BeanShell 方法 String amountInWords(String amount,String currency)
,它将传递的 amount
(例如 1,234.59
)和 currency
(例如“USD”)转换为单词(one thousand two hundred thirty four dollars,fifty nine cents
)。现在我想在某些单元格上按 F2 并输入公式,例如 =amountInWords(<Table2.D3>,"USD")
并将上述输出视为单元格内容。不幸的是,我收到了 ** Expression is faulty **
条消息。
有人可以建议我如何以所描述的方式使用此方法或确认这是不可能的吗?预先非常感谢您!
解决方法
Writer 表格公式比电子表格公式有更多限制。 http://libreoffice-dev.blogspot.com/2019/11/calculations-inside-of-writer-tables.html 中有支持的函数列表。不支持 AFAIK 调用宏。
可能您想要的不是表格而是通过转到插入 -> 对象 -> OLE 对象,在该位置将 Calc 电子表格嵌入到 Writer 文档中。然后将 amountInWords
重写为基本用户定义函数 (UDF)。
如果您必须使用 BeanShell,则编写一个基本 UDF 来加载和调用 BeanShell 方法。或者您可以创建一个 BeanShell Calc 加载项,尽管这更困难,需要 XML 配置文件。对于加载项,使用 Java 编写而不是 BeanShell 可能更容易,因为有更多示例和文档可用。
或者,不是嵌入电子表格,而是在 BeanShell 中创建一个搜索和替换 Writer 宏,以在表中执行任何所需的计算。将宏设置为在某个事件(例如文档打开时)上运行。