LibreOffice SDKを触ってみる

あるソフトウェアでかき集めたデータを、ODS形式なりXlsx形式なりで出力したくなったのでLibreOffice SDKを触ってみることにしました。

 

今回はもとのソフトウェアが主にライブラリの都合でC#で実装しています。LibreOffice SDKJavaから扱うのが一番よさそうですが引き続きC#で実装することにしました。

 

コンポーネントコンテキスト、サービスマネージャ、コンポーネントローダの取得など具体的な事とはネットで探すと出てきます。一例がこちら。

 

nekochango5.hateblo.jp

 

ここではハマった事をメモしたいと思います。用語用法や理解の不足は本職でプログラム組んでいるわけではないのでご容赦ください。

 

SDKLibreOffice本体の場所を環境変数で設定する必要があります。SDKのリファレンスにもあるように環境変数などビルド環境を設定するBatファイルが用意されていますが、こちらはコマンドライン上でビルドする場合に使うようです。手動で設定する変数も記載されていますが、どうにもうまく動きません(ビルドは通るが実行すると例外が投げられる)。

色々調べてみた結果、コード中で環境変数を書き換える方法が見つかりました。下記を参考にしたところ動き出すようになっています。

 

stackoverflow.com

 

  • 新規作成する場合はloadComponentFromURLの引数に作成したいファイル名ではなく"private:factory/***"を指定する。(****はドキュメントタイプ)

OpenOffice側のWikiに載っている事ではあるんですが、しばらくハマってました。実行するとURLが無効と例外が投げられます。一覧はなぜかなでしこのサポートから見つけました…。

 

nadesi.com

 

  • 保存形式はPropertyValueでFilterNameとして指定する

ネットで見つけたサンプルコートが、すでにあるファイルを編集する物ばかりで、新規作成したデータを保存する方法がわからずハマっていました。普通に保存するとODS形式なんですね…当たり前ですが。PropertyValue.NameにFilterNameを、PropertyValue.Valueにはuno.Anyクラスのオブジェクトとして形式を指定します。

 

www.okapiproject.com

yorozuyanet.hatenablog.com

 

その他のフィルター名はLibreOfficeのフォーラムに添付されてたであろうファイルソースコートリポジトリからフィルター名を知ることができました。OpenOfficeWikiにも一覧がありましたが、こちらはLibreOfficeに比べて対応形式が少ないようです。

 

Bootstrapで立ち上げたLibreOfficeプロセスは本体のソフトウェアが終了しても残るようです。終了時にプロセスを探してKillが必要みたいです。プロセス名は"soffice.exe"と"soffice.bin"が居るようで、今の所binの方を指定しています…が、こちらはもう少し調べたほうがいいかもしれません。

 

hima365.cocolog-nifty.com

 

  • ファイルの保存はcom.sun.star.frame.XStorableインターフェースのstoreメソッドを使う

これもSDKのリファレンスやサンプルコードを見ると書いてあるんですが、コンポーネントローダをXComponentLoaderとしてインスタンス生成しているのでstore系メソッドがありません。XStorableインターフェースにキャスト(C#とかこの場合でもキャストって言うのだろうか…)してstore系メソッドを呼ぶようです。また、この状態ではファイルが開いたままのようで、閉じる場合はXCloseableインターフェイスにキャストしてcloseメソッドを呼ぶ必要があるようです。

新規作成したデータはURLに紐付いてないと保存できないので保存処理前にすでに紐付いているか、変更があるかなど確認が必要のようです。

 

nekochango5.hateblo.jp

 

ネット上のサンプルを上記に注意して変更を加え、ファイルの作成とExcelで開けることを確認しました。今後は具体的にデータ入力やテンプレートの使用、PDFへのエクスポートを試してみたいと思います。

 

次はこのあたりのサイトを参考にする予定。

 

calibreblo.blogspot.com

librebasic.momiji-mac.com

hermione.s41.xrea.com

hermione.s41.xrea.com