ホーム - OpenOffice活用 - プロセスの起動

OpenOfficeのプロセス起動

OpenOffice.orgは「uno」という仕組みを利用して起動します。
OpenOffice.orgというコンポーネントコンテキスト(OpenOffice.orgの基本となるプロセスのようです。)の中にサービスマネージャがただ1つあり、そのサービスマネージャがコンポーネント(CalcやWriterなど)起動します。そして1つコンポーネントコンテキスト内に複数のコンポーネントが動いているというイメージのようです。

で、「実際に起動させるに具体的にはどうするの?」ということですが、

1.Bootstrapを使ってOpenOffice.orgの基本プロセスを起動する。

「uno.util.Bootstrap.bootstrap()」メソッドを使ってコンポーネントコンテキストオブジェクトが取得できます。「soffice.bin」「soffice.exe」がまだ起動されていない場合はこの操作によって起動されます。「soffice.bin」がメインのプロセスのようです。「soffice.bin」「soffice.exe」は複数のウィンドウが起動しても1つずつしか起動しません。

2.サービスマネージャを取得する。

取得したコンポーネントコンテキストオブジェクトの「getServiceManager()」メソッドを使ってサービスマネージャを取得します。

3.コンポーネントローダオブジェクトを生成する。

サービスマネージャの「createInstance("com.sun.star.frame.Desktop")」メソッドを実行してコンポーネントローダオブジェクトを取得します。

これをコードで書くと下記のようになります。(ここでは、クラスのネームスペースもフルパスで書いています。)
//コンポーネントコンテキストの取得
unoidl.com.sun.star.uno.XComponentContext localContext = uno.util.Bootstrap.bootstrap();

//サービスマネージャの取得
unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory = (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager();

//コンポーネントローダの取得
unoidl.com.sun.star.frame.XComponentLoader componentLoader = (unoidl.com.sun.star.frame.XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop");

					
これで下ごしらえができましたので、OpenOffice.orgのアプリケーション(CalcやWriter)を起動します。
下記のように実行すると、それぞれのアプリケーションのドキュメントオブジェクトが取得できます。

<< OpenOffice.org Calcの新規起動の場合 >>

unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0])
unoidl.com.sun.star.sheet.XSpreadsheetDocument spredsheetDocument = (unoidl.com.sun.star.sheet.XSpreadsheetDocument)component;

					
ちなみにOpenOffice.org Calcに「Hello World!」を表示させたいなら下記のコードを書き足してください。
//シートの取得
unoidl.com.sun.star.sheet.XSpreadsheets sheets = spredsheetDocument.getSheets();
unoidl.com.sun.star.sheet.XSpreadsheet sheet = (unoidl.com.sun.star.sheet.XSpreadsheet)sheets.getByName("表1").Value;

//セルに出力
sheet.getCellByPosition(0, 0).setFormula("Hello World!");

                    

<< OpenOffice.org Writerの新規起動の場合 >>

unoidl.com.sun.star.lang.XComponent component = componentLoader.loadComponentFromURL("private:factory/swriter", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]);
unoidl.com.sun.star.text.XTextDocument textDocument = (unoidl.com.sun.star.text.XTextDocument)component;