LibreOffice(24)NetBeans7でJavaのマクロを作成

2014-02-20

旧ブログ

t f B! P L

前の関連記事:LibreOffice(23)FirstStepsのMakefileの出力ログ


LibreOffice(23)FirstStepsのMakefileの出力ログでJavaで外部からLibreOfficeを操作することは失敗しましたがマクロとしてJavaでLibreOfficeを動かすこの方法はうまくいきました。

NetBeans7.4を使ってJavaマクロの作成とデバック環境の構築に成功


マクロではないのですがDeveloper's GuideにあるConfigurationにでてくるOpenOffice NetBeans IntegrationがNetBeans7.4では動きませんでしたし、EclipseでもJavaEclipseTutoにでてくるEclipse Plugin for OpenOffice.org extension development (OoEclipse)をインストールしてもLibreOfficeが指定できませんでしたのでIDEを使うのは諦めていました。

ところが昨夜JavaのマクロをNetBeansでつくる図つきのすごくわかりやすい解説ページを見つけました。

Scripting in Java with NetBeans IDE - Apache OpenOffice Wiki

この通りやってみるとうまくいきました。

これをとっかかりにLibreOffice(23)FirstStepsのMakefileの出力ログで失敗したDeveloper's GuideのFirstStepsの例などを動かせたらいいな、と思っています。

作成するJavaのマクロの例はWriting Macros - Apache OpenOffice Wikiにでてくるものです。

LibreOffice(13)デベロッパーガイド1 ほとんどの例はJavaに書いたようにこの部分は日本語訳のデベロッパーのガイドにはScripting Frameworkという章自体が載っていません。

さらにはWriting MacrosにはPythonについての解説がありますがApache OpenOffice Developer's GuideにでてくるPDF版には載っていないですね。

Javaのマクロの例はすでにインストールされている


LibreOffice Writerを起動して、ツール→マクロ→マクロの管理、ではJavaの項目がないのでJavaのマクロがすでにインストールされているとは気づきませんでした。


マクロの管理、ではなく、その上の、マクロを実行、でマクロセレクターを開きます。

そこのライブラリでLibreOfficeのマクロのなかにあるHelloWordを選択すると右のマクロ名にorg.libreoffice.example.java_scripts.printHWがあります。


これがJavaのマクロの例です。

HelloWorldの中以外にHighlightとMemoryUsageにも1つずつJavaのマクロが入っています。

これらはLibreOffice(2)Pythonの統合開発環境PyCharmのインストールでみたPythonのマクロと同じように、C:\Program Files (x86)\LibreOffice 4\share\Scriptsの下のjavaフォルダにあります。

Pythonマクロと違ってJavaマクロはjarファイルとparcel-descriptor.xmlファイルがセットになっているのでフォルダ単位での管理になります。

コンパイル後のjarファイル以外にソースファイルjavaも含まれています。

Javaマクロの例HelloWorldをマイマクロフォルダに移動させる


Scripting in Java with NetBeans IDEではこのorg.libreoffice.example.java_scripts.printHWのJavaマクロの例をソースを使って自分でコンパイルし直します。

C:\Program Files (x86)\LibreOffice 4\share\Scripts\java\HelloWorldにはJavaのソースファイルHelloWorld.javaも含まれているのでこのHelloWorldフォルダをマイマクロフォルダにコピーします。

Javaマクロのマイマクロフォルダは以下になります。隠しフォルダになっているのでLibreOffice(2)Pythonの統合開発環境PyCharmのインストールでやったようにエクスプローラの表示を変更しないと見えません。

C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\java

C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\ScriptsはLibreOfficeをインストールしてあらばすでにあるはずですのでそのなかにjavaフォルダがなければ自分で作ります。

そこにC:\Program Files (x86)\LibreOffice 4\share\Scripts\java\HelloWorldフォルダをコピーします。

HelloWorldフォルダの中にはHelloWorld.jar、HelloWorld.java、parcel-descriptor.xmlの3つのファイルがあります。

HelloWorld.jarはコンパイル後のファイルで、これから作るものですのでマイマクロフォルダに移動させた後は削除してしまいましょう。

これで実習材料が整いました。

NetBeans7.4でHelloWorldのプロジェクトを作成する


NetBeans7.4はLibreOffice(16)LibreOffice 4.1 SDKをインストールでインストールしたものです。

JDK7も一緒にインストールされています。

ファイル→新規プロジェクト。

1. プロジェクトを選択


すでにあるjavaソースファイルを使用するので、カテゴリ Java、プロジェクト 既存のソースを使用するJavaプロジェクト、を選択して「次」をクリック。

2. 名前と場所


プロジェクト名にHelloWorldと入力するとプロジェクトフォルダHelloWorldがC:\Users\ユーザー名\Documents\NetBeansProjectsに作成されます。

3. 既存のソース


ソース・パッケージ・フォルダの右にある「フォルダの追加」ボタンをクリックしてC:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\HelloWorldフォルダを追加します。

前述したようにこのフォルダは隠しフォルダなのでエクスプローラで隠しフォルダが見えるようにしておかないといけません。

LibreOffice(2)Pythonの統合開発環境PyCharmのインストールのPyCharmみたいにNetBeansに隠しフォルダ表示ボタンがあれば便利ですのにね。

4. 含める/除外する


プロジェクトに含めるファイルを選択します。

[含める」に*.javaといれると「含めるファイル」にjavaソースファイルのみ選択されます。

これで「終了」をクリックするとHelloWorldプロジェクトが作成されます。

プロジェクトにライブラリを追加する



左のプロジェクトウィンドウでHelloWorld→ソースパッケージ→<デフォルト・パッケージ>→HelloWorld.javaをダブルクリックすると右のパネルにHelloWorld.javaが開きます。

21行目から25行目までの行番号に感嘆符がついています。

ここにマウスカーソルをもっていくとimport文にあるパッケージが存在しません、と注意がでます。

これはLibreOfficeのライブラリを追加することで解決します。


HelloWorldプロジェクトを選択した状態で右クリックしてでてきたメニューからプロパティを選択します。


カテゴリ、で、ライブラリを選択します。

「JAR/フォルダの追加」をクリックして次の4つのjarファイルを追加します。


C:\Program Files (x86)\LibreOffice 4\program\classes\unoil.jar
C:\Program Files (x86)\LibreOffice 4\URE\java\juh.jar
C:\Program Files (x86)\LibreOffice 4\URE\java\jurt.jar
C:\Program Files (x86)\LibreOffice 4\URE\java\ridl.jar

こらら各ファイルの働きはA. Java-UNO - N->N->Nで解説されています。

これでパネルを閉じると21行目以降にでていた感嘆符が消えています。
package org.libreoffice.example.java_scripts;
19行目の感嘆符が残っており「パッケージが正しくありません」と表示されますがコンパイルに支障ありませんでした。


追加したjarファイルがライブラリに表示されます。

各jarファイルを展開すると含まれているパッケージがわかります。

コンパイルで生成したjarファイルをマイマクロフォルダに自動でコピーさせる設定


LibreOffice(19)Javaの例をmakeするではmakeというビルドツールを使ってコンパイルしましたがNetBeansではAntというビルドツールが一体化されておりNetBeansのメニューからAntツールが使えます。

Antの設定ファイルがbuild.xmlです。


ファイルウィンドウのなかでこのHelloWorldプロジェクトのbuild.xmlがみれます。

Scripting in Java with NetBeans IDEに書いてある通りbuild.xmlの最終行にある</project>の上行に以下を追加します。
    <!--
         This will copy the compiled jar to the Scripts/java/HelloWorld directory
    -->
    <target name="-post-jar">
        <copy overwrite="true" file="${dist.jar}" todir="${src.dir}"/>
    </target>

    <!--
        This will clean the copy of HelloWorld.jar in the Scripts/java/HelloWorld directory
    -->  
    <target name="-post-clean">
        <delete  file="${src.dir}/HelloWorld.jar" />
    </target>
build.xmlのコメントに解説してある通り、-post-jarはビルド後に実行するコマンドを設定できます。

これでコンパイル後にソースフォルダと同じフォルダにjarファイルをコピーします。

コピー元ファイル${dist.jar}とコピー先フォルダ${src.dir}はプロジェクトプロパティとC:\Users\ユーザー名\Documents\NetBeansProjects\HelloWorld\nbprojectにあるbuild-impl.xmlで設定されるようですが具体的にどこに書いてあるのかよくわかりませんでした。

(2015.2.1追記。build-impld.xmlの-init-projectターゲットで読み込まれるnbprojectフォルダのproject.propertiesファイルに定義が書いてありました。)

${src.dir}はプロジェクトプロパティのソースパッケージフォルダになるようです。

${dist.jar}はビルド時に作成されるC:\Users\ユーザー名\Documents\NetBeansProjects\HelloWorld\distになるようです。

HelloWorld.javaをコンパイルしてマイマクロフォルダにHelloWorld.jarを生成


ここまで設定したらコンパイルするのはもう簡単です。


NetBeansのメニューで、実行→プロジェクト(HelloWorld)をビルド、を実行します。

これでマイマクロフォルダにHelloWorld.jarが生成されます。

makeと違ってソースファイルを更新していなくてもプロジェクト(HelloWorld)をビルド、をすれば毎回コンパイルされるようです。

プロジェクト(HelloWorld)を消去してビルド、とするとC:\Users\ユーザー名\Documents\NetBeansProjects\HelloWorldにあるbuildフォルダが削除されてからまた作成されます。

プロジェクト(HelloWorld)をビルド、でもHelloWorld.classが更新されているので「消去してビルド」との違いがよくわからないです。

2015.2.7追記。distフォルダが消去されるのでやり直すときは「消去してビルド」を使う意味は大いにありました。一般的なJavaアプリケーションの開発 - NetBeans IDEチュートリアル

マクロセレクターへの表示にはparcel-descriptor.xmlが必要


マクロセレクターへ表示させるためにはマイマクロフォルダに生成したHelloWorld.jarと同じフォルダにparcel-descriptor.xmlが必要です。

Compiling and Deploying Java macros

HelloWorldマクロではすでにparcel-descriptor.xmlが用意されています。

NetBeansのファイルウィンドウのHelloWorld-ソース・パッケージの中にありNetBeansのナビゲータ画面で見れます。


functionnameでマクロが呼ばれたときに実行するJavaのメソッドを指定します。

この名前がマクロセレクターのマクロ名に表示されます。

descriptionの内容はマクロセレクターでマクロ名を選択したときの「説明」欄に表示されます。

マクロ名が好きに設定できないのはちょっと不便ですね。

displaynameやlogicalnameは空白でも問題ありませんでした。

classpathでマクロで使うjarかclassファイルを指定します。

prop name="calsspath", value=""とすると動きません。

各項目についてA. Java-UNO - N->N->Nに解説があります。

displaynameはマクロの実行ダイアログで表示される名称、logicalnameは実行する関数をクラス.関数名の形で指定するそうです。

local lang="en"は日本語を使うときはlocal lang ="ja"としたほうがよいみたいですが、しなくてもdescriptionには日本語が使えました。

JavaマクロHelloWorldを実行する


上記をすべて実行してC:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\javaにHelloWorld.jarとparcel-descriptor.xmlが入ったHelloWorldフォルダを完成させます。

完成後はLibreOfficeは再起動しないといけません。

LibreOffice Writerを起動します。

ツール→マクロ→マクロを実行、でマクロセレクターを開きます。


マイマクロにあるHelloWorldのなかにorg.libreoffice.example.java_scripts.HelloWorld.printHWがあります。

下の「説明」にparcel-descriptor.xmlのdescriptionの内容が表示されています。

これを実行します。
Hello World (in Java)

と表示されましたね。

(2015.1.31追記。LibreOffice4.1ではこのようにマイマクロフォルダに置いたJavaマクロを実行できましたが、LibreOffice4.2以降ではマイマクロフォルダに置いたJavaマクロはエラーがでて実行できなくなっていました。LibreOffice4.4.0.3に至ってはLibreOfficeのマクロフォルダのJavaマクロすら実行できませんでした。)

参考にしたサイト


Scripting in Java with NetBeans IDE - Apache OpenOffice Wiki
JavaマクロをNetBeansを使って作る実習

A. Java-UNO - N->N->N
日本語でJava-UNOが解説されています。

Compiling and Deploying Java macros
Developer's Guideのparcel-descriptor.xmlの解説。

build.xmlとは - build.xmlの概要 - Apache Antの使い方
build.xmlの読み方が解説されています。

一般的なJavaアプリケーションの開発 - NetBeans IDEチュートリアル
このチュートリアルをやるとNetBeansの使い方がだいたいわかります。

次の関連記事:LibreOffice(25)JavaのマクロをNetBeans7でデバッグする

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ