34

In einer UNO-Erweiterung für OpenOffice/LibreOffice Calc (Tabellenkalkulation), geschrieben in Java, wie können Sie die aufrufende Zelle in der Implementierung einer UDF (Tabellenkalkulationsfunktion) bestimmen?OOo/LibreOffice UNO/Java: Wie ruft man Tabellenkalkulationszelle einer Berechnungsfunktion auf?

Bemerkungen

  • In Excel/VBA dies über Application.Caller
  • Die Hauptmotivation möglich ist der Anrufer zu erhalten, ist die Anmeldung/Tracing/Debugging, das heißt, sehen die anrufende Zelle als Teil eines Stapels Spur.
  • Es sollte möglich sein, diese Informationen zu erhalten, da eingebaute Funktionen wie "ROW()" und "COLUMN()" etwas über die aufrufende Zelle wissen.
  • Eine Anwendung, wo diese Möglichkeit (für Excel) verwendet wird, ist Obba, ein Objekthandler für Kalkulationstabellen. Hier stellt das "Steuerfeld" eine Liste von (Java) Ausnahmen bereit, einschließlich der aufrufenden Zelle, , d. H., die Zelle ist Teil der Stapelverfolgung. Sehen Sie im folgenden Screenshot:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

Dies ist auch ein Feature-Request auf dem Apache OpenOffice Bugzilla

+5

Versuchen Sie, auf einem libreoffice IRC-Kanal zu fragen, einige aktive Entwickler sitzen dort und ich denke, es ist viel mehr möglich, dass Sie Ihre Antwort dort bekommen werden. –

Antwort

1

Es sieht aus wie Sie einen Zuhörer in ein Tabellenkalkulationskomponente registrieren möchten. Um Ihr Ziel zu erreichen, können Sie den Listener selbst dem Tabellenkalkulationsobjekt oder einem anderen verschachtelten Objekt hinzufügen, das eine Schnittstelle implementiert, die eine add. + EventListener() -Methode unterstützt.

Unten finden Sie ein Paar (Broadcaster/Hörer), dass ich glaube, können Sie in Ihrem Projekt verwenden: https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

Im Folgenden sind Beispiele dafür, wie: XDocumentEventBroadcaster/XDocumentEventListener

Das UNO-Event-Modell hier erklärt Diese Listener werden verwendet.

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

Auch der Dienst SheetCellRange unterstützt die Schnittstelle XModifyBroadcaster. Vielleicht könnten Sie das gewünschte Verhalten erhalten, wenn Sie ein XModifyListener-Objekt registriert haben. Das Objekt würde die 'modifizierte' Methode implementieren, die beim Aufruf ein EventObject empfängt. Ich glaube, Sie können herausfinden, wer der Aufrufer ist von der Source-Eigenschaft des EventObject. Wenn sich herausstellt, dass die Quelle der gesamte SheetCellRange ist, können Sie versuchen, alle Zellen, die Sie überwachen möchten, durchzuschleifen und jeweils einen XModifyListener hinzuzufügen. Der SheetCell-Dienst unterstützt auch die XModifyBroadcaster-Schnittstelle.

Beispiel für die Verwendung des XModifyBroadcaster von einem Cellrange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

Prost!

+0

Ich habe bereits Ereignis-Listener verwendet, aber sehe nicht, wie ich sie verwenden kann, um die aufrufende Zelle zu bekommen. Kannst du erklären, wie das geht? –

+0

Setzen Sie meine Ideen auf Ihre Frage auf eine Antwort bearbeiten. :) –

Verwandte Themen