2017-09-06 3 views
1

OpenOffice Calcの「マクロ」を開発しています。言語として、私はEclipseでコード支援を得るためにJavaを選択しました。私はさらに*.odsファイルに "マクロ"をコンパイルして埋め込む小さなantビルドスクリプトを書いた。一般に、これはうまく動作します。私はすでにいくつかの簡単なものを使っています。 UNOで、私はそのオブジェクトのデータ/コール・メソッドにアクセスできるようにするには、「クエリ」任意の非自明なオブジェクトのインターフェイスをする必要があるためOpenOffice Calc UNOオブジェクトがサポートしているJavaインターフェイスを知る方法(queryInterface経由)

しかし

はそう頻繁に私は動けなくなります。つまり、文字通り、与えられたオブジェクトがどのインターフェースを提供するかを推測する必要があります。これはではありません。 Java開発中(何らかのメタ情報、リフレクションなど)で目に見えず、まばらに文書化されています(私はたくさんのものをダウンロードしましたが、ソースまたは多分、私が使用しているインタフェースのJavaDocは、XButtonXPropertySetなどです。はsetLabelですが、はありません。getLabel - 何ですか?)。

オンラインドキュメントがあります(最も基本的なコンセプトはありません)、しかし、私は直面している多くの詳細が欠けています。それは常に私が解決する必要があるポイントで魔法のように正確に停止します。

C++コードを見て、オブジェクト(たとえば、私が現在取り組んでいるボタンなど)がどのようなインターフェースを提供しているのかという手がかりを得ることができます。曖昧に言うと、C++のクラス名とファイル名はJavaインターフェイスと完全に一致しません。それはほぼ私が探しているものですが、その後Javaで私は相当な、またはを呼び出す特定のオブジェクトにqueryInterfaceを呼び出すnullを返します..それは少しイライラしています。

UNO Javaインターフェイスはどのように生成されますか?生成されたコード(Java)の原点となるドキュメントには、ある種のドキュメントがありますか?

私は本当にがのJava-UNO-マクロ開発中にもう少し流暢になるためには、その時点で利用可能であるかのインタフェースを知る必要がありと思います。

答えて

0

深刻なUNOプロジェクトについては、イントロスペクションツールを使用してください。

例として、Calcでボタンを作成した後、Java Object Inspectorを使用してボタンを参照しました。 右クリックして「ソースコードに追加」を選択すると、次のような結果が得られました。

import com.sun.star.awt.XControlModel; 
import com.sun.star.beans.XPropertySet; 
import com.sun.star.container.XIndexAccess; 
import com.sun.star.container.XNameAccess; 
import com.sun.star.drawing.XControlShape; 
import com.sun.star.drawing.XDrawPage; 
import com.sun.star.drawing.XDrawPageSupplier; 
import com.sun.star.sheet.XSpreadsheetDocument; 
import com.sun.star.sheet.XSpreadsheets; 
import com.sun.star.uno.AnyConverter; 
import com.sun.star.uno.UnoRuntime; 
import com.sun.star.uno.XInterface; 

//... 
public void codesnippet(XInterface _oUnoEntryObject){ 
try{ 
    XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(XSpreadsheetDocument.class, _oUnoEntryObject); 
    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets(); 
    XNameAccess xNameAccess = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, xSpreadsheets); 
    Object oName = xNameAccess.getByName("Sheet1"); 
    XDrawPageSupplier xDrawPageSupplier = (XDrawPageSupplier) UnoRuntime.queryInterface(XDrawPageSupplier.class, oName); 
    XDrawPage xDrawPage = xDrawPageSupplier.getDrawPage(); 
    XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(XIndexAccess.class, xDrawPage); 
    Object oIndex = xIndexAccess.getByIndex(0); 
    XControlShape xControlShape = (XControlShape) UnoRuntime.queryInterface(XControlShape.class, oIndex); 
    XControlModel xControlModel = xControlShape.getControl(); 
    XPropertySet xPropertySet = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xControlModel); 
    String sLabel = AnyConverter.toString(xPropertySet.getPropertyValue("Label")); 
}catch (com.sun.star.beans.UnknownPropertyException e){ 
    e.printStackTrace(System.out); 
    //Enter your Code here... 
}catch (com.sun.star.lang.WrappedTargetException e2){ 
    e2.printStackTrace(System.out); 
    //Enter your Code here... 
}catch (com.sun.star.lang.IllegalArgumentException e3){ 
    e3.printStackTrace(System.out); 
    //Enter your Code here... 
} 
} 
//... 

Python-UNOは、特定のインターフェイスにクエリする必要がないため、Javaより優れている可能性があります。また、XrayToolとMRIは、Java Object Inspectorよりも使いやすくなっています。

+0

これは素晴らしいです!どうもありがとうございます。 Pythonのヒントも良いです、私はすでにJava/-C++ではないアプローチがより簡単なアクセスを可能にすると疑っていました。ありがとうございました! – SomeDev

関連する問題