top / index / prev / next / target / source

2005-06-10 diary: Java: OpenOffice.org SDKを用いた Excelファイルを新規作成するサンプル

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: OpenOffice.org SDKを用いた Excelファイルを新規作成するサンプル

OpenOffice.org SDK を用いた Excelファイルを新規作成するトイプログラムを作りました。サンプルソースコードをメモしておきます。

OpenOffice.org SDK を用いた Excelファイルを新規作成するためのサンプル

OpenOffice.org SDK を用いた Excelファイルを新規作成するためのサンプルです。

確認に利用した動作環境

動作条件

import java.io.File;

import com.sun.star.beans.Property; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.beans.XPropertySetInfo; import com.sun.star.bridge.XBridge; import com.sun.star.bridge.XBridgeFactory; import com.sun.star.comp.helper.Bootstrap; import com.sun.star.connection.ConnectionSetupException; import com.sun.star.connection.NoConnectException; import com.sun.star.connection.XConnection; import com.sun.star.connection.XConnector; import com.sun.star.frame.XComponentLoader; import com.sun.star.frame.XController; import com.sun.star.frame.XModel; import com.sun.star.frame.XStorable; import com.sun.star.lang.XComponent; import com.sun.star.lang.XMultiComponentFactory; import com.sun.star.sheet.XSpreadsheet; import com.sun.star.sheet.XSpreadsheetDocument; import com.sun.star.sheet.XSpreadsheetView; import com.sun.star.sheet.XSpreadsheets; import com.sun.star.text.XText; import com.sun.star.uno.UnoRuntime; import com.sun.star.uno.XComponentContext;

/** * @author Tosiki IGA / public class OOoWriteExcelSample { /* * UNO接続で利用する接続先情報 */ public static final String DEFAULT_CONNECTION_STRING = "socket,host=localhost,port=8100,tcpNoDelay=1";

/**
 * UNO接続で利用するソケットコネクション
 */
private XConnection connection = null;

public static void main(String[] args) {
    try {
        new OOoWriteExcelSample().process();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void process() throws Exception {
    System.out.println("Excelブックを新規作成してファイル保存します.");

    File fileTarget = new File("./sample.xls");
    if (fileTarget.exists()) {
        fileTarget.delete();
    }

    System.out.println("OpenOfficeに接続するための前準備を実施します.");
    XBridge bridge = createOOoBridge(DEFAULT_CONNECTION_STRING);
    if (bridge == null) {
        return;
    }
    Object desktop = createDesktopInstance(bridge);
    if (desktop == null) {
        return;
    }
    System.out.println("OpenOfficeに接続するための前準備が完了しました.");

    XComponentLoader componentLoader = (XComponentLoader) UnoRuntime
            .queryInterface(XComponentLoader.class, desktop);

    System.out.println("Calcドキュメントを新規作成します.");
    PropertyValue[] loadProps = new PropertyValue[1];
    loadProps[0] = new PropertyValue();
    loadProps[0].Name = "Hidden";
    loadProps[0].Value = new Boolean(false);

    XComponent component = componentLoader.loadComponentFromURL(
            "private:factory/scalc", "_blank", 0, loadProps);
    XSpreadsheetDocument document = (XSpreadsheetDocument) UnoRuntime
            .queryInterface(XSpreadsheetDocument.class, component);

    System.out.println("Calcシートを新規作成します.");
    XSpreadsheets sheets = document.getSheets();
    sheets.insertNewByName("Sheet1", (short) 0);
    XSpreadsheet sheet = (XSpreadsheet) UnoRuntime.queryInterface(
            XSpreadsheet.class, sheets.getByName("Sheet1"));

    System.out.println("Sheet1をアクティブに設定します.");
    XModel model = (XModel) UnoRuntime.queryInterface(XModel.class,
            component);
    XController controller = model.getCurrentController();
    XSpreadsheetView view = (XSpreadsheetView) UnoRuntime.queryInterface(
            XSpreadsheetView.class, controller);
    view.setActiveSheet(sheet);

    System.out.println("A1に値をセット. (XText経由)");
    XText text = (XText) UnoRuntime.queryInterface(XText.class, sheet
            .getCellByPosition(0, 0));
    text.setString("test");

    System.out.println("A2に値をセット. (setValue経由)");
    sheet.getCellByPosition(0, 1).setValue(123456);

    System.out.println("A3に値をセット. (セルのプロパティFormulaLocal経由)");
    XPropertySet prop = (XPropertySet) UnoRuntime.queryInterface(
            XPropertySet.class, sheet.getCellByPosition(0, 2));
    prop.setPropertyValue("FormulaLocal", "256,512");
    prop.setPropertyValue("CellBackColor", new Integer(0xC0C0C0));

    if (false) {
        System.out.println("PropertySetInfoをデバッグ表示します.");
        XPropertySetInfo propinfo = prop.getPropertySetInfo();
        Property[] props = propinfo.getProperties();
        for (int index = 0; index < props.length; index++) {
            System.out.println("propertySet:" + props[index].Name + "="
                    + prop.getPropertyValue(props[index].Name).toString());
        }
    }

    Thread.sleep(2000);

    System.out.println("Calcドキュメントを指定のファイル(" + fileTarget.getAbsolutePath()
            + ")に保存処理します.");
    XStorable storable = (XStorable) UnoRuntime.queryInterface(
            XStorable.class, component);

    PropertyValue[] saveProps = new PropertyValue[1];
    saveProps[0] = new PropertyValue();
    saveProps[0].Name = "FilterName";
    saveProps[0].Value = "MS Excel 97";

    storable.storeToURL(fileTarget.toURL().toString(), saveProps);
    component.dispose();

    System.out.println("OpenOfficeへの接続の後処理(UNO接続のクローズ処理)を実施します.");
    connection.close();

    System.out.println("Excelブックを新規作成してファイル保存の一連の処理を終了します.");
}

/**
 * OpenOfficへのブリッジ接続(UNO接続)をオープンします
 * 
 * @param 接続先情報
 * @return
 */
public XBridge createOOoBridge(String connectionString) {
    System.out.println("OpenOfficへのブリッジ接続(UNO接続)をオープンします.");
    try {
        XComponentContext localContext = Bootstrap
                .createInitialComponentContext(null);
        XMultiComponentFactory localServiceManager = localContext
                .getServiceManager();
        XConnector connector = (XConnector) UnoRuntime.queryInterface(
                XConnector.class, localServiceManager
                        .createInstanceWithContext(
                                "com.sun.star.connection.Connector",
                                localContext));
        try {
            connection = connector.connect(connectionString);
        } catch (NoConnectException ex) {
            System.err.println("UNO接続に失敗しました:" + ex.toString());
            return null;
        } catch (ConnectionSetupException ex) {
            System.err.println("UNO接続のセットアップに失敗しました:" + ex.toString());
            return null;
        }
        XBridgeFactory bridgeFactory = (XBridgeFactory) UnoRuntime
                .queryInterface(XBridgeFactory.class, localServiceManager
                        .createInstanceWithContext(
                                "com.sun.star.bridge.BridgeFactory",
                                localContext));
        return bridgeFactory.createBridge("", "urp", connection, null);
    } catch (Exception ex) {
        System.err.println("ブリッジ作成処理全般を通して例外が発生しました.:" + ex.toString());
        return null;
    }
}

/**
 * OpenOfficeのデスクトップインスタンスを作成します.
 * 
 * @param bridge
 * @return
 */
public static Object createDesktopInstance(XBridge bridge) {
    System.out.println("OpenOfficeのデスクトップインスタンスを作成します.");
    try {
        XMultiComponentFactory serviceManager = (XMultiComponentFactory) UnoRuntime
                .queryInterface(XMultiComponentFactory.class, bridge
                        .getInstance("StarOffice.ServiceManager"));
        XPropertySet propertySet = (XPropertySet) UnoRuntime
                .queryInterface(XPropertySet.class, serviceManager);
        XComponentContext remoteContext = (XComponentContext) UnoRuntime
                .queryInterface(XComponentContext.class, propertySet
                        .getPropertyValue("DefaultContext"));
        XMultiComponentFactory remoteServiceManager = remoteContext
                .getServiceManager();
        return remoteServiceManager.createInstanceWithContext(
                "com.sun.star.frame.Desktop", remoteContext);
    } catch (Exception ex) {
        System.err.println("OpenOfficeのデスクトップインスタンス作成において例外が発生しました.:"
                + ex.toString());
        return null;
    }
}

} ```

blancoReportの基礎技術調査の過程で、調べる必要が出てきました。OpenOffice.org SDKの情報は まだまだ不足気味でした。

参考資料

他のAPIによる同様の実装

この日記へのツッコミ

関連する日記

世間のニュースから


この日記について