java user-defined-functions libreoffice openoffice-calc uno

OOo/LibreOffice UNO/Java: ¿Cómo hacer para llamar a la celda de la hoja de cálculo de una función calc?



user-defined-functions openoffice-calc (1)

En una extensión de UNO para OpenOffice / LibreOffice Calc (hoja de cálculo), escrita en Java, ¿cómo se puede determinar la célula de llamada dentro de la implementación de una UDF (función de hoja de cálculo)?

Observaciones

  • En Excel / VBA esto es posible a través de Application.Caller
  • La motivación principal para obtener el llamante es el registro / rastreo / depuración, es decir, ver la celda de llamada como parte de un rastreo de pila.
  • Debería ser posible obtener esta información, ya que las funciones incorporadas como "ROW ()" y "COLUMN ()" tienen algún conocimiento de la celda de llamada.
  • Una aplicación donde se usa esta posibilidad (para Excel) es Obba , un manejador de objetos para hojas de cálculo. Aquí, el "panel de control" proporciona una lista de excepciones (Java), incluida la celda de llamada, es decir , la celda es parte del rastreo de la pila. Ver la siguiente captura de pantalla:

Esta es también una solicitud de función en Apache OpenOffice Bugzilla


Parece que desea registrar un oyente en un componente de hoja de cálculo. Para satisfacer su objetivo, puede agregar el oyente al objeto de hoja de cálculo en sí mismo, o a otro objeto anidado que implemente una interfaz que admita un método add. + EventListener ().

Debajo hay un par (locutor / oyente) que puedo pensar que podrías usar en tu proyecto: XDocumentEventBroadcaster / XDocumentEventListener

El modelo de eventos de UNO se explica aquí: https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

A continuación hay ejemplos de cómo se usan estos oyentes.

//////////////////////////////////////////////////////////////////// // 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) { } });

Además, el servicio SheetCellRange es compatible con la interfaz XModifyBroadcaster. Tal vez podría obtener el comportamiento deseado si registró un objeto XModifyListener. El objeto implementaría el método ''modificado'', que recibe un EventObject cuando se llama. Creo que puede obtener quién es el que llama desde la propiedad de origen de EventObject. Si la fuente resulta ser todo el SheetCellRange, podrías tratar de recorrer todas las celdas que deseas que sean monitoreadas, y agregar un XModifyListener a cada una de ellas. El servicio SheetCell también es compatible con la interfaz XModifyBroadcaster.

Ejemplo de uso del XModifyBroadcaster desde un CellRange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

¡Aclamaciones!