2013-07-14 22 views
34

W rozszerzeniu UNO dla OpenOffice/LibreOffice Calc (Arkusz kalkulacyjny), napisanym w Javie, jak określić komórkę wywołującą w implementacji UDF (funkcja arkusza kalkulacyjnego)?OOo/LibreOffice UNO/Java: Jak uzyskać wywołanie komórki arkusza kalkulacyjnego funkcji calc?

Uwagi

  • w programie Excel/VBA jest to możliwe poprzez Application.Caller
  • główną motywacją, aby rozmówca jest rejestrowanie/śledzenie/debugowanie, czyli zobaczyć celę wzywającą jako część stosu ślad.
  • Powinno być możliwe uzyskanie tych informacji, ponieważ wbudowane funkcje, takie jak "ROW()" i "COLUMN()", mają pewną wiedzę na temat komórki wywołującej.
  • Aplikacja, w której ta możliwość jest używana (w przypadku programu Excel), to Obba, program obsługi obiektów dla arkuszy kalkulacyjnych. Tutaj "panel sterowania" zawiera listę wyjątków (Java), w tym komórkę wywołującą, , tj., komórka jest częścią śledzenia stosu. Zobacz poniższy zrzut ekranu:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

Jest to również cecha prośba o Apache OpenOffice Bugzilla

+5

Spróbuj zapytać na kanale IRC libreoffice, niektórzy aktywni deweloperzy siedzą tam i myślę, że jest to dużo bardziej prawdopodobne, że dostaniesz tam odpowiedź. –

Odpowiedz

1

Wygląda chcesz zarejestrować słuchacza do komponentu arkusza kalkulacyjnego. Aby spełnić swój cel, możesz dodać detektor do obiektu arkusza kalkulacyjnego samodzielnie lub do innego zagnieżdżonego obiektu, który implementuje interfejs obsługujący metodę add. + EventListener().

Poniżej znajduje się para (nadawca/słuchacz), który może Myślę, że można użyć w swoim projekcie: XDocumentEventBroadcaster/XDocumentEventListener

modelu zdarzeń UNO jest wyjaśnione tutaj: https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Event_Model

Poniżej przedstawiono przykłady, jak używa się tych słuchaczy.

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

Ponadto usługa SheetCellRange obsługuje interfejs XModifyBroadcaster. Może mógłbyś uzyskać pożądane zachowanie, jeśli zarejestrujesz do niego obiekt XModifyListener. Obiekt implementowałby metodę "zmodyfikowaną", która odbiera EventObject po wywołaniu. Wierzę, że możesz uzyskać, kto wywołujący jest z właściwości źródłowej EventObject. Jeśli źródłem okaże się cały SheetCellRange, możesz spróbować przeszukać wszystkie komórki, które chcesz monitorować, i dodać XModifyListener do każdego z nich. Usługa SheetCell obsługuje również interfejs XModifyBroadcaster.

Przykład stosowania XModifyBroadcaster ze CellRange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

zdrowie!

+0

Użyłem już detektorów zdarzeń, ale nie widzę sposobu, w jaki mogę ich użyć do pobrania komórki wywołującej. Czy możesz wyjaśnić, jak można to zrobić? –

+0

Umieść moje pomysły na swoje pytanie podczas edycji odpowiedzi. :) –