Okapi Project

Java から OpenOffice.org の操作(Hello World 編)

バージョン
2004 年 1 月 30 日 Ver.1.0
作成者
J.Daita ( Xware )

要約

Java から OpenOffice.org を操作して、Excel を作ってみましょう。ここでは、簡単なプログラムを使って、OpenOffice.org を利用した Excel 出力方法を紹介します。

目次


1. プログラムの実行

 まずは、プログラムを実行してみましょう。

ここでは、統合開発ツール Eclipse を使って行います。サンプルプログラムは、OpenOffice.org SDK についているプログラムを使用します。
 また、Java の基礎知識、Eclipse の使用方法、共に理解していることを前提に紹介いたします。

サンプルプログラム
OpenOffice.org1.1_SDK\examples\java\Spreadsheet

1.1. プログラム実行環境の構築

サンプルプログラムとして、Spreadsheet 配下のファイルを全て Eclipse のプロジェクトに取り込みます。

すると、コンパイルエラーとなってしまいます。OpenOffice.org を操作する場合、OpenOffice.org を操作する各種 API を利用します。
 そのため、API へのクラスパスを設定する必要があります。

Java のビルド・パスの外部 Jar の追加より、%OPENOFFICE_HOME%\program\classes 配下にある Jar ファイルにクラスパスを設定します。

クラスパスを設定しても、CalcAddins.java のコンパイルエラーは解消されません。
 今回、サンプルとして使用する SCalc の実行には、CalcAddins.java は必要ありませんので削除します。

1.2. サンプルプログラム実行

 これで、コンパイルエラーがなくなりますので、SCalc を実行してみましょう。

上記のように、グラフが出力されれば成功です。その他のサンプル(ChartTypeChange.java、EuroAdaption.java)も良かったら試しに動かしてみてください。

では、実際にどうのようなプログラムを作成すれば、OpenOffice を操作することが出来るのか見ていきましょう。

2. 簡易プログラムの作成と解説

2.1. プログラムの概要

ここで作成する簡易プログラムは、OpenOffice.org の表計算ソフト(Calc)に「Hello Worod」と出力するプログラムです。

このプログラムは、次のような処理となります。

1) OpenOffice.org との接続
 2) 表計算ソフト(Calc)の起動
 3) シートの取得
 4) セルの取得
 5) 値の設定

コメントを見ながら実際にプログラムをトレースして見ましょう。

import com.sun.star.uno.XInterface;

import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XMultiComponentFactory;

import com.sun.star.bridge.XUnoUrlResolver;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XNamingService;
import com.sun.star.uno.XComponentContext;

import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XComponentLoader;

import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.table.XCellRange;
import com.sun.star.table.XCell;
import com.sun.star.beans.PropertyValue;
import com.sun.star.lang.XComponent;

/**
 * OpenOffice.org の表計算(Calc)に「Hello World」と出力する。
 */
public final class Sample01 {

    /**
     * static クラスとする
     */
    private Sample01() { }

    /**
     * 起動パラメータなし。
     * @param args String
     */
    public static void main(final String[] args) {

        //OpenOffice.org との接続
        String sConnectionString =
            "uno:socket,host=localhost,port=8100;urp;StarOffice.NamingService";

        XMultiServiceFactory xMSF = null;
        XSpreadsheetDocument myDoc = null;
        XCell oCell = null;

        try {
            xMSF = connect(sConnectionString);

        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("OpenOffice が起動されていますか?");
            System.out.println("OpenOffice がListenモードで起動されていますか?");
            System.out.println("ポート8100があっていますか?");
        }

        //Calc を起動
        myDoc = openCalc(xMSF);

        XSpreadsheet oSheet = null;

        try {
            //Calc のシートオブジェクトを取得
            XSpreadsheets oSheets = myDoc.getSheets();
            XIndexAccess oIndexSheets =
                (XIndexAccess) UnoRuntime.queryInterface(
                    XIndexAccess.class,
                    oSheets);

            //一番目のシートオブジェクトを取得
            oSheet =
                (XSpreadsheet) UnoRuntime.queryInterface(
                    XSpreadsheet.class,
                    oIndexSheets.getByIndex(0));

            //一番目のシートの「A1」セルオブジェクトを取得
            XCellRange xCellRange = oSheet.getCellRangeByName("A1");
            com.sun.star.sheet.XSheetCellRange xSheetCellRange =
                (com.sun.star.sheet.XSheetCellRange) UnoRuntime.queryInterface(
                    com.sun.star.sheet.XSheetCellRange.class,
                    xCellRange);

            com.sun.star.sheet.XSheetCellCursor xSheetCellCursor =
                oSheet.createCursorByRange(xSheetCellRange);
            com.sun.star.table.XCellCursor xCursor =
                (com.sun.star.table.XCellCursor) UnoRuntime.queryInterface(
                    com.sun.star.table.XCellCursor.class,
                    xSheetCellCursor);

            //A1セルに「Hello World」と設定
            xCursor.getCellByPosition(0, 0).setFormula("Hello World");

        } catch (Exception e) {
            e.printStackTrace();
        }

        //処理終了
        System.exit(0);

    }

    /**
     * OpenOffice.orgとの接続
     * @param connectStr String
     * @return XMultiServiceFactory
     * @throws Exception Exception
     */
    public static XMultiServiceFactory connect(final String connectStr)
        throws Exception {

        // Get component context
        XComponentContext xcomponentcontext =
            com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(
                null);

        // initial serviceManager
        XMultiComponentFactory xLocalServiceManager =
            xcomponentcontext.getServiceManager();

        // create a connector, so that it can contact the office
        Object xUrlResolver =
            xLocalServiceManager.createInstanceWithContext(
                "com.sun.star.bridge.UnoUrlResolver",
                xcomponentcontext);
        XUnoUrlResolver urlResolver =
            (XUnoUrlResolver) UnoRuntime.queryInterface(
                XUnoUrlResolver.class,
                xUrlResolver);

        Object rInitialObject = urlResolver.resolve(connectStr);

        XNamingService rName =
            (XNamingService) UnoRuntime.queryInterface(
                XNamingService.class,
                rInitialObject);

        XMultiServiceFactory xMSF = null;
        if (rName != null) {

            Object rXsmgr =
                rName.getRegisteredObject("StarOffice.ServiceManager");

            xMSF =
                (XMultiServiceFactory) UnoRuntime.queryInterface(
                    XMultiServiceFactory.class,
                    rXsmgr);
        }

        return (xMSF);
    }

    /**
     * Calc ドキュメントを起動します。
     * @param oMSF XMultiServiceFactory
     * @return XSpreadsheetDocument
     */
    public static XSpreadsheetDocument
                           openCalc(final XMultiServiceFactory oMSF) {

        //define variables
        XInterface oInterface;
        XDesktop oDesktop;
        XComponentLoader oCLoader;
        XSpreadsheetDocument oDoc = null;
        XComponent aDoc = null;

        try {

            oInterface =
                (XInterface) oMSF.createInstance("com.sun.star.frame.Desktop");
            oDesktop =
                (XDesktop) UnoRuntime.queryInterface(
                    XDesktop.class,
                    oInterface);
            oCLoader =
                (XComponentLoader) UnoRuntime.queryInterface(
                    XComponentLoader.class,
                    oDesktop);
            PropertyValue[] szEmptyArgs = new PropertyValue[0];
            String doc = "private:factory/scalc";
            aDoc = oCLoader.loadComponentFromURL(doc, "_blank", 0, szEmptyArgs);
            oDoc =
                (XSpreadsheetDocument) UnoRuntime.queryInterface(
                    XSpreadsheetDocument.class,
                    aDoc);

        } catch (Exception e) {
            e.printStackTrace();
        }

        return oDoc;
    }
}

sample01.java プログラム

3. Excel 形式のファイルに保存する

OpenOffice.org で「Hello World」の出力は出来ましたでしょうか?
 次は、2 で作成した Calc ファイルから Excel 形式のファイルを作成します。
 上記プログラムの「Hello World」を設定した直後に、com.sun.star.frame.XStorable オブジェクトを使用して、Excel 形式のファイルを作成します。
 ファイルの保存形式、保存場所を指定しています。
 この保存形式を変えることで、PDF 出力に変更することも可能です。

            XStorable xstorable =
                (XStorable) UnoRuntime.queryInterface(XStorable.class, myDoc);

            PropertyValue[] storeProps = new PropertyValue[1];

            storeProps[0] = new PropertyValue();

            storeProps[0].Name = "FilterName";

            storeProps[0].Value = "MS Excel 97";

            xstorable.storeAsURL(
                    new File("D:/test.xls").toURL().toString(),
                    storeProps);

sample02.java プログラム


Copyright © 2003 - 2006 Okapi Project All Rights Reserved.