Подтвердить что ты не робот

OOo/LibreOffice UNO/Java: как получить вызывающую ячейку электронной таблицы функции calc?

В расширении UNO для OpenOffice/LibreOffice Calc (Spreadsheet), написанном на Java, как вы можете определить вызывающую ячейку внутри реализации UDF (функция электронной таблицы)?

Примечания

  • В Excel/VBA это возможно через Application.Caller
  • Основная мотивация получения вызывающего абонента - это регистрация/трассировка/отладка, то есть просмотр вызывающей ячейки как часть трассировки стека.
  • Должна быть доступна эта информация, поскольку встроенные функции, такие как "ROW()" и "COLUMN()", имеют некоторое представление о вызывающей ячейке.
  • Приложение, в котором эта возможность используется (для Excel), является Obba, обработчиком объектов для электронных таблиц. Здесь "панель управления" предоставляет список исключений (Java), включая вызывающую соту, т.е. Ячейка является частью трассировки стека. См. Следующий снимок экрана:

Obba Control Panel showing exceptions by spreadsheet cell of calling function

Это также запрос функции на Apache OpenOffice Bugzilla

4b9b3361

Ответ 1

Похоже, вы хотите зарегистрировать слушателя в компоненте электронной таблицы. Чтобы удовлетворить вашу цель, вы можете добавить слушателя к объекту электронной таблицы самостоятельно или к другому вложенному объекту, который реализует интерфейс, поддерживающий метод add. + 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.

Пример использования XModifyBroadcaster из CellRange: http://openoffice.2283327.n4.nabble.com/Re-How-to-get-the-XModifyBroadcaster-from-Cell-CellRange-Table-td2771959.html

Ура!