34 votes

OOo / LibreOffice UNO / Java: Comment obtenir une cellule de feuille de calcul appelante d’une fonction calc?

Dans un UNO extension pour OpenOffice/LibreOffice Calc (Tableur), écrit en Java, comment pouvez-vous déterminer l'appel de la cellule à l'intérieur de la mise en œuvre d'une fonction (fonction de feuille de calcul)?

Remarques

  • Dans Excel/VBA ceci est possible via Application.Caller
  • La principale motivation de l'appelant est enregistrement/suivi/débogage, c'est à dire, la vue de la convocation de la cellule dans le cadre d'une trace de la pile.
  • Il devrait être possible d'obtenir cette information, étant donné que les fonctions intégrées comme la LIGNE "()" et "COLONNE()" ne ont peu de connaissance de l'appel de la cellule.
  • Une application où cette possibilité est utilisée (pour Excel) est Obba, un gestionnaire d'objet pour les feuilles de calcul. Ici le "panneau de configuration" fournit une liste de (Java) exceptions, notamment à l'appel de la cellule, c'est à dire, la cellule est la partie de la trace de la pile. Voir la capture d'écran suivante:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

C'est aussi une fonction de demande sur le Apache OpenOffice Bugzilla

1voto

Il semble que vous voulez enregistrer un écouteur à un composant feuille de calcul. Pour satisfaire votre objectif, vous pouvez ajouter l'écouteur à l'objet feuille de calcul elle-même, ou à un autre objet imbriqué qui implémente une interface qui prend en charge un complément.+EventListener() la méthode.

Ci-dessous est une paire (diffuseur/auditeur) que je ne peux que vous pourriez utiliser dans votre projet: XDocumentEventBroadcaster/XDocumentEventListener

Le UNO modèle d'événement est expliqué ici: https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

Ci-dessous sont des exemples de la façon dont ces écouteurs sont utilisés.

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

Aussi, le service SheetCellRange prend en charge l'interface XModifyBroadcaster. Vous pourriez peut-être obtenir le comportement désiré si vous avez enregistré un XModifyListener objet. L'objet serait de mettre en œuvre la "date de modification "méthode" qui reçoit une EventObject lorsqu'il est appelé. Je crois que vous pouvez obtenir qui l'appelant est à partir de la source de la propriété de la EventObject. Si la source s'avère être l'ensemble de SheetCellRange, vous pouvez essayer de faire une boucle par toutes les cellules que vous souhaitez qu'être surveillés, et ajouter un XModifyListener à chacun. Le SheetCell service prend également en charge la XModifyBroadcaster interface .

Exemple d'utilisation de la XModifyBroadcaster à partir d'un CellRange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

Cheers!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X