2012-03-21 3 views
4

Я действительно застреваю, пытаясь выяснить, как принудительно обновлять программные вычисления (3.3) сокетов, когда значения ячеек являются закладками, а закладки обновляются программно (через UNO вызовы на Java).Писатель OpenOffice - программно обновляющие таблицы с формулами ячеек

Пример

| 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 

ответ

3

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

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

Update: Это не будет работать, если исходные клетки в формуле обновляется имеют формат, применяемый к ним, формат назначения ячейка не имеет значения.

Код

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