▲ | ▼ | 目次 | OpenOffice.orgTop |
Java から OpenOffice.org を操作して、Excel を作ってみましょう。ここでは、簡単なプログラムを使って、OpenOffice.org を利用した Excel 出力方法を紹介します。
まずは、プログラムを実行してみましょう。
ここでは、統合開発ツール Eclipse を使って行います。サンプルプログラムは、OpenOffice.org SDK についているプログラムを使用します。
また、Java の基礎知識、Eclipse の使用方法、共に理解していることを前提に紹介いたします。
サンプルプログラムとして、Spreadsheet 配下のファイルを全て Eclipse のプロジェクトに取り込みます。
すると、コンパイルエラーとなってしまいます。OpenOffice.org を操作する場合、OpenOffice.org を操作する各種 API を利用します。
そのため、API へのクラスパスを設定する必要があります。
Java のビルド・パスの外部 Jar の追加より、%OPENOFFICE_HOME%\program\classes 配下にある Jar ファイルにクラスパスを設定します。
クラスパスを設定しても、CalcAddins.java のコンパイルエラーは解消されません。
今回、サンプルとして使用する SCalc の実行には、CalcAddins.java は必要ありませんので削除します。
これで、コンパイルエラーがなくなりますので、SCalc を実行してみましょう。
上記のように、グラフが出力されれば成功です。その他のサンプル(ChartTypeChange.java、EuroAdaption.java)も良かったら試しに動かしてみてください。
では、実際にどうのようなプログラムを作成すれば、OpenOffice を操作することが出来るのか見ていきましょう。
ここで作成する簡易プログラムは、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 プログラム
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 プログラム