Javaで LibreOffice を操作できるらしいという LibreOffice API を使ってみる

f:id:ts0818:20190511192212j:plain

Microsoft Excelとの互換性がある(ただし完全ではない)、それがLibreOfficeのCalc であると。どうもボクです。

サーバサイドで単体テストなんかでExcelのデータと連携したいあるあるですよね。

ということで、今回は、LibreOfficeのCalc とサーバサイド言語のコラボについて調査してみました。

 

どんな方法があるのか

Excelなんかだと、 

qiita.com

⇧  上記サイト様がまとめてくださっています。

んで、LibreOfficeについては、

www.slideshare.net

⇧  上記のスライドで知ったのですが、「LibreOffice API」なるものが存在するらしいですと。

 

Javaの場合

というか、Javaで使用されるのが最も一般的ということらしいです。

wiki.openoffice.org

This manual describes how to write programs using the component technology UNO (Universal Network Objects) with OpenOffice.org.

Most examples provided are written in Java. As well as Java, the language binding for C++, the UNO access for OpenOffice.org Basic and the OLE Automation bridge that uses OpenOffice.org through Microsoft's component technology COM/DCOM is described.

Apache OpenOffice Developer's Guide - Apache OpenOffice Wiki

⇧   そして、「UNO(Universal Network Objects)」っていうコンポーネントを使うことで、LibreOfficeを操作できるんだと。

Wikipediaさんにお聞きしてみた。

Universal Network Objects (UNO) はOpenOffice.orgで用いられているソフトウェアコンポーネントである。インターフェース志向であり、LAN内部もしくはインターネット上で単一のコンピュータにおいて、異なるプログラム言語や、オブジェクトモデル、マシンアーキテクチャ間の相互運用性を提供することを目的とする。

Universal Network Objects - Wikipedia

UNOは言語バインディングのあるプログラム言語であれば、どの言語からであっても実装もしくはアクセスすることができる。完全なUNO言語バインディングC++ (コンパイラに依存)やJavaPythonTcl向けに存在する。またObject REXXに対する作業が現在行われている。アクセスのみが可能なバインディングStarOffice Basicや、OLE Automation.NETCommon Language Infrastructure向けに存在する。

UNOはLGPL下において配布されているFLOSSである。

Universal Network Objects - Wikipedia

⇧  対応してるサーバサイド言語として、C++JavaPython、 などと仰っていますね。

LibreOfficeの公式の説明(LibreOffice 6.2 の場合)

The SDK provides a rich set of examples in different programming languages (Java, Python, C++, LibreOffice 6.2 Basic, OLE) to illustrate the use of the API and demonstrate how to benefit from the included word processor, spreadsheet, presentation software, graphics program and database of LibreOffice 6.2.

LibreOffice 6.2 SDK - Examples

⇧  JavaPythonC++、などで使えると。 

 

www.openoffice.org

Uno is the component model of OpenOffice.orgUno offers interoperability between programming languages, other components models and hardware architectures, either in process or over process boundaries, in the Intranet as well as in the Internet. Unocomponents may be implemented in and accessed from any programming language for which a Uno implementation (AKA language binding) and an appropriate bridge or adapter exists.

The Uno web is organized as described in Uno/Meta/Organization.

Probably most interesting for many people is, what we are currently doing in Uno, which you can find in the efforts area. One of the bigger things is the extension of Binary Unos threading-model.

f:id:ts0818:20190511122837p:plain

LibreOffice 6.2 SDK - Examples

⇧  よく分からんけども、LibreOffice API ってのが、LibreOfficeの機能をUNO(Universal Network Objects)として、多言語へ提供しているというイメージですかね?

 

 

必要なものを準備

JavaLibreOffice API を使うためには、 

がパソコンにインストールされていればOKのようです。 統合開発環境としては、Eclipse を使っていきたいと思います。

 

LibreOffice

LibreOfficeがバージョン5系だったので、6系に更新してみました。 

f:id:ts0818:20190511135349p:plain

インストールしてくれるらしい

f:id:ts0818:20190511135440p:plain

f:id:ts0818:20190511135503p:plain

f:id:ts0818:20190511135823p:plain

んで、

f:id:ts0818:20190511140401p:plain

「refreshenv」ってコマンドを実行すれば良いと。

f:id:ts0818:20190511141339p:plain

んで、環境変数はというと...

f:id:ts0818:20190511150634p:plain

⇧  設定されとらんやんけ~!soffice.exe の配置してるフォルダまで移動すればコマンドを実行できますが...chocolatey さんよ~頼みますぜ...

残念ながら、環境変数は自分で設定するしか無さそうですね...

 

LibreOfficeのインストール自体は成功し、最新になったらしい。

f:id:ts0818:20190511141733p:plain

「C:\Program Files\LibreOffice\program\scalc.exe」を実行で、LibreOffice Calc(Microsoft OfficeExcel に相当)を起動。

f:id:ts0818:20190511141820p:plain

「ヘルプ(H)」>「LibreOffice について」で、バージョンが確認できました。

f:id:ts0818:20190511141925p:plain



LibreOffice SDK
chocolatey でインストールできるパッケージに存在しないので、LibreOfficeの公式サイトからインストーラーをインストールで。

https://ja.libreoffice.org/download/libreoffice/ にアクセスし、

ja.libreoffice.org

LibreOffice_6.2.3_Win_x64_sdk.msi」をダウンロード。

f:id:ts0818:20190511143418p:plain

ダウンロードしたインストーラーを起動。ダブルクリックで起動できるかと。

f:id:ts0818:20190511144110p:plain

「Next >」で。

f:id:ts0818:20190511144400p:plain

2019年5月12日(日)追記  ↓  ここから

なんか、インストール先ですが、

wiki.openoffice.org

In this window you will have to configure the path to your OpenOffice.org and to its SDK. So, let us begin with the SDK path: click on the Add button next to the SDKs list. You will have a window like the one shown in following illustration. Browse to your OpenOffice.org 2.0 SDK and validate. Then you will have to do the same for the OpenOffice.org path using the other Add button.

Note that a URE installation can be selected instead of a complete OpenOffice.org installation. Please refer to the Java URE application tutorial for more details on the plugin's URE support.

If you are using Windows, please make sure that the path to the SDK does not contains any spaces. Spaces in the path can cause problems when you build your UNO projects.

LibreOffice 6.2 SDK - Examples

⇧  Eclipse と連携する場合、SDKのパスにはスペースを含めるなって言ってますね...なのに、デフォルトのインストール先にスペースを含むパスが指定されてるインストーラーってどうなの... 

2019年5月12日(日)追記  ↑  ここまで

「Next >」で。(インストール先は特に変更してません。)

f:id:ts0818:20190511144500p:plain

「Install」で。

f:id:ts0818:20190511144616p:plain

インストールが始まります。

f:id:ts0818:20190511144642p:plain

「Finish」で。

f:id:ts0818:20190511144740p:plain

インストールされました。

f:id:ts0818:20190511144905p:plain


Java

インストール済みなので、インストールについてなどは割愛。インストールされてない方は、他サイト様を参考にインストールしてみてください。

バージョンが表示されれば、JavaのインストールはOKかと。

f:id:ts0818:20190511145451p:plain


統合開発環境

Eclipseについてもインストール済みなので割愛。インストールされてない方は、他サイト様を参考にインストールしてみてください。
 

LibreOffice API を試してみる

とりあえず、Eclipseで試していきたいと思うので、LibreOffice SDKに同梱されてるExampleでJava用の見本が用意されてるので、

f:id:ts0818:20190511153617p:plain

⇧  この子たちを使っていこうと。

んで、Eclipseにプロジェクトをインポートする際に、一括でプロジェクトをインポートできないらしい。

muimy.hatenadiary.org

⇧  上記サイト様によりますと、Eclipseプラグインでイケるらしいとのことですが、そのプラグインが、2004年(最終更新が2004-05-23)で止まってしまっていると...

codeday.me

⇧  上記サイト様によりますと、1つのディレクトリにプロジェクト全部ぶちこめば一括インポートできるらしい。

どうせ、1つのディレクトリにまとめるなら、「SVN」や「Git」なんかのバージョン管理ツールを使用してプロジェクトを管理していこうと。

なので、今回は、Git を使っていこうかと。なので、GitとTortoiseGit がインストールされてる体で進めて参りますので、インストールされてない方は、他サイト様を参考にインストールしてみてください。

ちなみに、

d.hatena.ne.jp

⇧  上記サイト様によりますと、Eclipseワークスペース内にgitリポジトリを置くのはNGらしいです。

ということで、「C:\Program Files\LibreOffice\sdk\examples\java」に、gitリポジトリ作成で。

f:id:ts0818:20190511164220p:plain

よく分からんけども、non-bare で。 

f:id:ts0818:20190511164533p:plain

「bare」「non-bare」 については、

yoshinorin.net

⇧  上記サイト様が詳しいです。

で、エラー。

f:id:ts0818:20190511165349p:plain

⇧  なんか、Cドライブ配下だと駄目なんすかね?UAC(ユーザーアカウント制御、User Account Control)とか関係してるのかと思ったのですが、

became-free.com

⇧  上記サイト様によりますと、別の要因がありそうな感じですかね。

 

ということで、デスクトップにディレクトリ作成で。

f:id:ts0818:20190511171826p:plain

f:id:ts0818:20190511171932p:plain

⇧  イケました。

 

Eclipseワークスペース用のディレクトリを適当に作成。

f:id:ts0818:20190511154053p:plain

 

そしたらば、Eclipseを起動で。

ワークスペース(W):」に、さきほど作成したものを指定。 

f:id:ts0818:20190511155254p:plain

f:id:ts0818:20190511155357p:plain

んで、「ファイル(F)」>「インポート(I)...」で。

f:id:ts0818:20190511180146p:plain

「Git」>「Git からプロジェクト」で。

f:id:ts0818:20190511180230p:plain

「既存ローカル・リポジトリー」を選択し、「次へ(N) >」で。

f:id:ts0818:20190511180354p:plain

「追加(A)...」で。

f:id:ts0818:20190511180605p:plain

「完了(F)」で。

f:id:ts0818:20190511180732p:plain

「次へ(N) >」で。

f:id:ts0818:20190511180809p:plain

「一般的なプロジェクトしてインポート(G)」にチェックし、「次へ(N) >」で。

f:id:ts0818:20190511183312p:plain

「完了(F)」で。

f:id:ts0818:20190511183341p:plain

インポートされました。

f:id:ts0818:20190511183432p:plain

⇧  「?」マークが付いているのは、

snagimo.com

プロジェクトエクスプローラを見ると、ファイル名に「?(はてなマーク)」と「>(不等号記号)」が付いているのが分かります(「?」はコミットやステージングエリアへの追加などが未実施であることを表し、「>」はディレクトリ上の変更がローカルリポジトリに反映されていないことを表します)

Eclipse 上のプロジェクトを GitHub・Bitbucket などのサービスにアップする方法 | Snagimo

⇧  上記サイト様によりますと、コミットなんかをまだ一回もしてないからということらしいので、気にしなくても良さそうです。

だが、しかし!

Java プロジェクトとして認識されとらんのか、main メソッドのあるJavaファイルの実行で、

f:id:ts0818:20190511190318p:plain

⇧  「Javaアプリケーションの実行」が選択肢として出てこない...

qiita.com

⇧  上記サイト様によりますと、git あるあるらしい...

 

ameblo.jp

⇧  上記サイト様によりますと、「構成」>「ファセット・フォームへ変換...」でいけるらしい。

f:id:ts0818:20190511190609p:plain

んで、どれにチェックを?

f:id:ts0818:20190511191411p:plain

www.ksakae1216.com

⇧  上記サイト様を参考にさせていただくと、今回は、Javaプロジェクトなので、Javaにだけチェックすれば良いかと。

f:id:ts0818:20190511191607p:plain

無事、Javaプロジェクトとして認識されました。

f:id:ts0818:20190511191718p:plain

駄目でした...。

f:id:ts0818:20190511192846p:plain

 

teratail.com

⇧  Javaファイルは、srcフォルダの配下にないと駄目みたいですね。

というわけで、

f:id:ts0818:20190511193306p:plain

srcに移動で。

f:id:ts0818:20190511193436p:plain

f:id:ts0818:20190511193518p:plain

F5 でEclipse を更新すると、

f:id:ts0818:20190511193627p:plain

エラーの嵐。「ビルド・パス」の設定をしないとならんらしい。

f:id:ts0818:20190511193737p:plain

「ライブラリー(L)」タブで、「外部 JAR の追加(X)...」を選択。

f:id:ts0818:20190511194355p:plain

「C:\Program Files\LibreOffice\program\classes」配下のjarファイルをすべて選択。

f:id:ts0818:20190511195929p:plain

「Apply and Close」で。

f:id:ts0818:20190511200116p:plain

エラーが消えず...

なんてこった...srcフォルダに配置したから、フォルダ名がパッケージとして認識されてしまうのね...

f:id:ts0818:20190511200847p:plain

「ファセット・フォームへ変換」をフォルダごとにやんなければ駄目そうですね...それぞれのフォルダをJavaプロジェクトにせねばという...面倒くさ。

 

一旦、この状態のフォルダ構成に。

f:id:ts0818:20190511204439p:plain

プロジェクト・ファセットをもとに戻す方法は、なんか無さ気なので、できてしまった「.project」ファイルを編集するしかないと。

f:id:ts0818:20190511204708p:plain

⇧  こうすると、Javaプロジェクトとして認識されなくなるので。Eclipse側で、「F5」で更新すると。
で、他のフォルダはそもそもプロジェクト化されてないんで、1つづつプロジェクト化するしかないかと...。Gradle とかビルドツールを使えば、何か一括で全プロジェクト化とかできるのかもしらんけど、やり方が分からんす...

f:id:ts0818:20190511220935p:plain

Java」>「Java プロジェクト」を選択し「次へ(N) >」で。

f:id:ts0818:20190511221718p:plain

「デフォルト・ロケーションを使用(D)」のチェックを外し、「参照(R)...」をクリック。

f:id:ts0818:20190511221832p:plain

「C:\Users\Toshinobu\Desktop\testLibreApi\Spreadsheet」 にしてみました。

f:id:ts0818:20190511221952p:plain

「次へ(N) >」で。

f:id:ts0818:20190511222028p:plain

「完了(F)」で。

f:id:ts0818:20190511222124p:plain

パースペクティブを開く(O)」で。

f:id:ts0818:20190511222316p:plain

んで、Javaプロジェクトになったので、ライブラリを追加せねば。

f:id:ts0818:20190511222732p:plain

f:id:ts0818:20190511222912p:plain

f:id:ts0818:20190511223002p:plain

f:id:ts0818:20190511223035p:plain

んで、エラーが残ると...

f:id:ts0818:20190511232851p:plain

「org.openoffice.sheet.addin.XCalcAddins」が見つからんって言われてもね...

www.okapiproject.com

⇧  上記サイト様でも同様のエラーが...って、2004年から解消されてないの?これ!
衝撃なんですけど...
っていうか、Exampleで動かんやつ置かれても困るわ...15年間変わらずって...

他は動きました。

f:id:ts0818:20190512010443p:plain

f:id:ts0818:20190512010404p:plain

何ていうか、情報が少ないのもそうだけど、15年同じ問題を放置し続けるって...LibreOffice APIって、なんかオワコン的な状態なのかしら...

まぁ、今日も時間を無駄にしてしまった...

今回はこのへんで。