gpt4 book ai didi

java - OOo/LibreOffice UNO/Java : How to get calling spreadsheet cell of a calc function?

转载 作者:IT老高 更新时间:2023-10-28 20:56:20 25 4
gpt4 key购买 nike

在用 Java 编写的 OpenOffice/LibreOffice Calc(电子表格)的 UNO 扩展中,如何确定 UDF(电子表格函数)实现中的调用单元格?

备注

  • 在 Excel/VBA 中,这可以通过 Application.Caller
  • 获取调用者的主要动机是记录/跟踪/调试,即将调用单元视为堆栈跟踪的一部分。
  • 应该可以获得这些信息,因为像“ROW()”和“COLUMN()”这样的内置函数确实对调用单元有一些了解。
  • 使用这种可能性的应用程序(用于 Excel)是 Obba ,电子表格的对象处理程序。这里的“控制面板”提供了一个 (Java) 异常列表,包括调用单元,,该单元是堆栈跟踪的一部分。请参阅以下屏幕截图:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

这也是 Apache OpenOffice Bugzilla 上的功能请求

最佳答案

您似乎想为电子表格组件注册一个监听器。为了满足您的目标,您可以将监听器添加到它自己的电子表格对象中,或者添加到另一个实现支持 add.+EventListener() 方法的接口(interface)的嵌套对象中。

以下是我认为您可以在项目中使用的一对(广播员/听众): XDocumentEventBroadcaster/XDocumentEventListener

这里解释了 UNO 事件模型:https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

以下是如何使用这些监听器的示例。

    //////////////////////////////////////////////////////////////////// 
// Add document window listeners.
////////////////////////////////////////////////////////////////////

System.out.println("WriterDoc: Add window listeners.");

// Example of adding a document displose listener so the application
// can know if the user manually exits the Writer window.

document.addEventListener(new XEventListener() {
public void disposing(EventObject e) {
System.out.println(
"WriterDoc (Event Listener): The document window is closing.");
}
});

// Example of adding a window listener so the application can know
// when the document becomes initially visible (in the case of this
// implementation, we will manually set it visible below after we
// finish building it).

window.addWindowListener(new XWindowListener() {
public void windowShown(com.sun.star.lang.EventObject e) {
System.out.println(
"WriterDoc (Window listener): The document window has become visible.");
}
public void windowHidden(com.sun.star.lang.EventObject e) { }
public void disposing(com.sun.star.lang.EventObject e) { }
public void windowResized(com.sun.star.awt.WindowEvent e) { }
public void windowMoved(com.sun.star.awt.WindowEvent e) { }
});

此外,SheetCellRange 服务支持接口(interface) XModifyBroadcaster。如果您向其注册了 XModifyListener 对象,也许您可​​以获得所需的行为。该对象将实现“修改”方法,该方法在调用时接收一个 EventObject。我相信你可以从 EventObject 的 source 属性中知道调用者是谁。如果源结果是整个 SheetCellRange,您可以尝试遍历您希望被监视的所有单元格,并为每个单元格添加一个 XModifyListener。 SheetCell 服务还支持 XModifyBroadcaster 接口(interface)。

使用 CellRange 中的 XModifyBroadcaster 的示例: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

干杯!

关于java - OOo/LibreOffice UNO/Java : How to get calling spreadsheet cell of a calc function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17637601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com