OpenOffice编写器 - 以编程方式更新带有单元格公式的表

时间:2012-03-21 11:18:08

标签: java openoffice-writer uno

当单元格值是书签并且书签以编程方式更新(通过Java中的UNO调用)时,我真的很难找到如何强制程序刷新openoffice writer(3.3)单元格计算。

实施例

| 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 个答案:

答案 0 :(得分:3)

我自己已经弄清楚了。关键是使用XRefreshable并知道表中的单元格公式算作“文本字段” - 所以使用传统的冗长(但有趣)的UNO元编程风格......

  • 从XTextDocument实例
  • 查询文本字段供应商
  • 从文本字段枚举中查询可刷新的实例
  • 致电刷新

更新:如果要更新的公式中的源单元格已应用了格式,则无法使用此格式,目标单元格的格式无关紧要。

代码

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