2012-03-21 129 views
4

我真的被卡住了,試圖找出當單元格值爲書籤和書籤以編程方式更新時,如何強制編程刷新openoffice writer(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例如
  • 查詢刷新的實例字段枚舉
  • 通話刷新

更新:如果更新公式中的源細胞已應用到它們的格式,這是行不通的,目的地的格式細胞並不重要。

代碼

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