OOo / LibreOffice UNO / Java:如何获得调用calc函数的电子表格单元格?

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

备注

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

Obba控制面板通过调用函数的电子表格单元显示异常

这也是Apache OpenOffice Bugzilla的function要求

它看起来像你想注册一个电子表格组件的侦听器。 为了实现您的目标,您可以将侦听器添加到电子表格对象本身,或者添加到另一个嵌套对象,该对象实现支持添加。+ EventListener()方法的接口。

下面是一对(广播/听众),我可以认为你可以在你的项目中使用: 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支持接口XModifyBroadcaster。 也许你可以得到所需的行为,如果你注册一个XModifyListener对象。 该对象将实现“修改”方法,该方法在调用时接收EventObject。 我相信您可以从EventObject的源属性中获取调用者的身份。 如果源代码是整个SheetCellRange,则可以尝试循环遍历希望监视的所有单元格,并向每个单元添加一个XModifyListener。 SheetCell服务也支持XModifyBroadcaster接口。

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

干杯!