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;