当单元格值是书签并且书签以编程方式更新时(通过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

最佳答案

我自己弄清楚了。关键是使用XRefreshable并知道表中的单元格公式算作“文本字段”-因此使用传统的traditional绕(但有趣)的UNO元编程样式...

  • 从XTextDocument实例
  • 查询文本字段供应商
  • 从文本字段枚举
  • 查询可刷新实例
  • 调用刷新

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

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

    09-30 12:18
    查看更多