java - OpenOffice writer - 以编程方式使用单元格公式更新表格

标签 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

最佳答案

我自己解决了。关键是要用XRefreshable并且知道表格中的单元格公式算作“文本字段”——因此使用传统的冗长(但有趣)UNO 元编程风格...

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

更新:如果正在更新的公式中的源单元格应用了格式,这将不起作用,目标单元格的格式无关紧要。

代码

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

关于java - OpenOffice writer - 以编程方式使用单元格公式更新表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9803552/

相关文章:

Java泛型方法签名解释

python - 边际 Openoffice python

java - 使用 cdt eclipse 获取 C 程序的数组下标

java - RMI:检查客户端崩溃

java - 无法从文本文档检索 XBookmarksSupplier

python-2.7 - python + wx & uno 使用 ubuntu 14.04 填充 libreoffice

python - OpenOffice pyuno "select all"

c++ - Libreoffice API(UNO):来自xTextField的文本和数据

java - 每个值的迭代运行多次 LinkedHashMap

c# - 使用 C# 将 html 文本插入 .odt OpenOffice 文档