Top > OOoSF > Java > Macro

Java のマクロ Edit

OpenOffice.org のマクロを Java で記述します。Java の管理ダイアログはありません。ユーザー設定の user/Scripts/java 以下に自分で保存する必要があります。

Java での UNO コンポーネントの作成と bootstrap でのオートメーションの例は SDK に多数ありますが、マクロの実行の例は OOo の share/Scripts/java 以下にあるものくらいしかありません。

マクロの作成 Edit

Java でマクロを作成するには次のような手順で行います。

  1. コードを書く (IDE でもエディタでも何でもかまいません)
  2. コンパイルする (クラスパスに program/classes 以下にある juh.jar, jurt.jar, ridl.jar, unoil.jar を含めておきます)
  3. クラスが複数あるときには jar ファイルにまとめます
  4. parcel-descriptor.xml ファイルを書きます
  5. user/Scripts/java 以下のディレクトリに配置します
  6. 実行します

コードを書く Edit

最初は地道に書いていましたが、面倒になったので MRI で生成されたコードを利用しました。生成されたコードほとんどそのままでクラス定義と関数定義をいじっただけです。 行番号表示/非表示切替

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
-
|
|
!
!
!
import com.sun.star.container.XIndexAccess;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.sheet.XSpreadsheet;
import com.sun.star.sheet.XSpreadsheetDocument;
import com.sun.star.sheet.XSpreadsheets;
import com.sun.star.table.XCell;
import com.sun.star.table.XCellRange;
import com.sun.star.text.XTextRange;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.script.provider.XScriptContext;
 
public class CalcMacro {
 
    public static void do_something(XScriptContext xScriptContext) {
        try {
            XSpreadsheetDocument xSpreadsheetDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(
                    XSpreadsheetDocument.class, xScriptContext.getDocument());
            XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
 
            XIndexAccess xIndexAccess = (XIndexAccess) UnoRuntime.queryInterface(
                    XIndexAccess.class, xSpreadsheets);
            XSpreadsheet xSpreadsheet = (XSpreadsheet) UnoRuntime.queryInterface(
                    XSpreadsheet.class, xIndexAccess.getByIndex(0));
 
            XCellRange xCellRange = (XCellRange) UnoRuntime.queryInterface(
                    XCellRange.class, xSpreadsheet);
            XCell xCell = xCellRange.getCellByPosition(1, 1);
 
            XTextRange xTextRange = (XTextRange) UnoRuntime.queryInterface(
                    XTextRange.class, xCell);
            xTextRange.setString("...");
 
        } catch (WrappedTargetException e1) {
            // getByIndex
            e1.printStackTrace(System.err);
        } catch (IndexOutOfBoundsException e2) {
            // getByIndex, getCellByPosition
            e2.printStackTrace(System.err);
        }
    }
}

コンパイルする Edit

IDE を使っているのであれば上記四つの jar ファイルをクラスパスに含めてコンパイルしてください。地道にコンパイルする場合でもクラスパスに含めます。

jar ファイルにまとめる Edit

ここではクラスファイルは一つなのでまとめずに使用します。

parcel-descriptor.xml ファイルを書く Edit

share/Scripts/java 以下にあるファイルをコピーして自分のライブラリのものに書き換えると楽に作成できます。

jar ファイルにまとめたときには classpath に jar ファイルを指定します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
<?xml version="1.0" encoding="UTF-8"?>
<parcel language="Java" xmlns:parcel="scripting.dtd">
    <script language="Java">
        <locale lang="en">
            <displayname value="CalcMacroTest"/>
            <description>
                Calc: macro test.
            </description>
        </locale>
        <functionname value="CalcMacro.do_something"/>
        <logicalname value="CalcMacro.do_something"/>
        <languagedepprops>
            <prop name="classpath" value=""/>
        </languagedepprops>
    </script>
</parcel>

配置する Edit

user/Scripts/CalcMacro ディレクトリを作成、CalcMacro.class および parcel-descriptor.xml ファイルを入れておきます。

実行 Edit

Calc を起動、ツール - マクロ - マクロの実行から CalcMacro/CalcMacro.do_something を実行します。

ドキュメントのマクロ Edit

ドキュメントに Java のマクロを入れておく場合、注意が必要です。

ドキュメントのファイルを zip 解凍して Scripts/java 以下に HelloWorld/ を作成して parcel-descriptor.xml および HelloWorld.jar を配置したときには META-INF/manifest.xml ファイルに以下の行を追加しておく必要があります。

<manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/java/HelloWorld/parcel-descriptor.xml"/>
<manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/java/HelloWorld/HelloWorld.jar"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/java/HelloWorld/"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/java/"/>
<manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>

これらの行を追加しなかった場合、ドキュメントを上書き保存したときなどに Java のマクロが削除されてしまいます。


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes