OpenOffice Writer - программно обновлять таблицы с помощью формул ячеек - PullRequest
4 голосов
/ 21 марта 2012

Я действительно застрял, пытаясь выяснить, как заставить программно обновить вычисления ячеек openoffice writer (3.3), когда значения ячеек являются закладками, а закладки обновляются программно (через вызовы UNO в Java).

Пример

| start | stop  | duration    |
| 9:30  | 11:30 | = <A2>-<B2> | <= cell formula

Это прекрасно работает, когда пользователь вручную редактирует таблицу, значение обновляется при переходе к следующей ячейке.Однако, если я обновляю значения программно, вставляя текст в закладки в ячейках, вычисленные ячейки не обновляются.Они будут обновляться, если вы щелкнете по таблице, но я бы хотел, чтобы это происходило автоматически.

Закладка находится в таблице следующим образом.

| start     | stop    | duration    |
| <start0>  | <stop0> | = <A2>-<B2> |

Пример кода для обновления закладки:

XBookmarksSupplier xBookmarksSupplier = (XBookmarksSupplier) UnoRuntime.queryInterface(XBookmarksSupplier.class, document); 
XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks(); 

Object bookmark = xNamedBookmarks.getByName("stop0"); 
XTextContent xBookmarkContent = (XTextContent) UnoRuntime.queryInterface(XTextContent.class, bookmark); 
xBookmarkContent.getAnchor().setString("11:30"); 

// code needed to force calculation of duration cell

1 Ответ

3 голосов
/ 21 марта 2012

Я понял это сам.Ключ заключается в том, чтобы использовать XRefreshable и знать, что формулы ячеек в таблицах считаются «текстовыми полями», поэтому используется традиционный многоплановый (но забавный) стиль метапрограммирования UNO ...

  • запрос текстовых полей поставщика из экземпляра XTextDocument
  • запрос обновляемого экземпляра из перечисления текстовых полей
  • обновление вызова

Обновление: это не будет работать, если источникк ячейкам в обновляемой формуле применяется формат, к которому относится ячейка назначения.

Код

XTextFieldsSupplier tfSupplier = (XTextFieldsSupplier) 
        UnoRuntime.queryInterface(XTextFieldsSupplier.class, document); 
XRefreshable refreshable = (XRefreshable) 
        UnoRuntime.queryInterface(XRefreshable.class, tfSupplier.getTextFields()); 
refreshable.refresh(); 
...