インターフェースクエリ
UNO コンポーネントは一つのコンポーネントで複数のインターフェースをサポートしています。インターフェースのクエリが必要な言語では利用したいインターフェースが必要です。インターフェースのクエリが必要な言語では特に問題になりません。
IDL Reference を見ると大抵のメソッドはインターフェース型の値を返します。これはコンポーネントのベースインターフェースです。
例えば Java ではインターフェースのクエリが必要です。次のコードを見てみます。
import com.sun.star.container.XIndexAccess; import com.sun.star.sheet.XSpreadsheets; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.uno.UnoRuntime; ... // Calc ドキュメントのシートコンテナを取得する XSpreadsheetDocument xSheetDoc = UnoRuntime.queryInterface( XSpreadsheetDocument.class, doc); XSpreadsheets xSheets = xSheetDoc.getSheets(); // 0, 1.. といったインデックスでシートを取得するには XIndexAccess xIndexAcc = UnoRuntime.queryInterface( XIndexAccess.class, xSheets); Object sheet = xIndexAcc.getByIndex(0);
getSheets メソッドの返り値は css.sheet.XSpreadsheets 型です。このインスタンスは Calc ドキュメントにあるシートへのアクセスを提供しておりシートコンテナと呼ばれることもあります。このインターフェースは css.container.XNameContainer インターフェースを継承していますがシートをインデックスで取得したいのであれば css.container.XIndexAccess インターフェースをクエリする必要があります。
さらに css.sheet.XCellRangesAccess インターフェースが必要になったときには xSheets からクエリします。xIndexAcc などからクエリしてはいけません。
あるコンポーネントがどのようなインターフェースをエクスポートしているか確認するには IDL Reference を参照する必要があります。またはオブジェクトの情報を Object Inspector などで確認します。