top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
OpenOffice.org SDK を用いた Excelファイルを新規作成するトイプログラムを作りました。サンプルソースコードをメモしておきます。
OpenOffice.org SDK を用いた Excelファイルを新規作成するためのサンプルです。
OpenOffice.org 1.1.4 をインストールする。
「スタートアップ」から「OpenOffice」を除去する。
タスクトレイ内の「クイック起動」を終了する。
OpenOffice を UNOのポートソケット付きで起動する。
例: "C:\Program Files\OpenOffice.org1.1.4\program\soffice" "-accept=socket,port=8100;urp;"
OOoLauncherによるUNOのポートソケット付き起動という起動方法も存在します。
確認に利用した動作環境
Sun Java2 SDK 1.5.0_03 (Windows版)
OpenOffice.org 1.1.4 (Windows版)
動作条件
OpenOffice.org SDK への jarファイルにクラスパスが通してあること OOoWriteExcelSample.java
``` /*
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: First Steps http://api.openoffice.org/docs/DevelopersGuide/FirstSteps/FirstSteps.htm#1+First+Steps
api: Module text http://api.openoffice.org/docs/common/ref/com/sun/star/text/module-ix.html
上記APIなどの日本語訳サイトなども参考にさせていただきました。しかし URLを失念してしまいました。
他のAPIによる同様の実装
2005/02/13 日記: Java: Jakarta POI (HSSF) を用いたExcelファイルを新規作成するサンプル
2005/02/21 日記: Java: JExcelApi (Java Excel API) を用いたExcelファイルを新規作成するサンプル
この日記へのツッコミ
関連する日記
2005/06/12 日記: Java: OpenOffice.org SDKを用いた PDFファイルを新規作成するサンプル
2005/06/14 日記: OpenOffice.org SDKのAPIが なぜあのような姿をしているのかについてのメモ
2005/02/25 日記: OpenOffice.org SDKへの道のり , KNOPPIX+Webサーバでクラック耐性運用が可能に