5

セル値がブックマークであり、ブックマークがプログラムで (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
4

1 に答える 1

3

私は自分でそれを理解しました。重要なのは、XRefreshableを使用し、テーブル内のセル式が「テキスト フィールド」としてカウントされることを理解することです。そのため、従来の長い (しかし楽しい) UNO メタプログラミング スタイルを使用します...

  • XTextDocument インスタンスからテキスト フィールド サプライヤーをクエリする
  • テキスト フィールド列挙からの更新可能なインスタンスのクエリ
  • コールリフレッシュ

更新: 更新される数式のソース セルに書式が適用されている場合、これは機能しません。宛先セルの書式は関係ありません。

コード

XTextFieldsSupplier tfSupplier = (XTextFieldsSupplier) 
        UnoRuntime.queryInterface(XTextFieldsSupplier.class, document); 
XRefreshable refreshable = (XRefreshable) 
        UnoRuntime.queryInterface(XRefreshable.class, tfSupplier.getTextFields()); 
refreshable.refresh(); 
于 2012-03-21T11:50:32.303 に答える