Java のマクロ 
OpenOffice.org のマクロを Java で記述します。Java の管理ダイアログはありません。ユーザー設定の user/Scripts/java 以下に自分で保存する必要があります。
Java での UNO コンポーネントの作成と bootstrap でのオートメーションの例は SDK に多数ありますが、マクロの実行の例は OOo の share/Scripts/java 以下にあるものくらいしかありません。
マクロの作成 
Java でマクロを作成するには次のような手順で行います。
- コードを書く (IDE でもエディタでも何でもかまいません)
- コンパイルする (クラスパスに program/classes 以下にある juh.jar, jurt.jar, ridl.jar, unoil.jar を含めておきます)
- クラスが複数あるときには jar ファイルにまとめます
- parcel-descriptor.xml ファイルを書きます
- user/Scripts/java 以下のディレクトリに配置します
- 実行します
コードを書く 
最初は地道に書いていましたが、面倒になったので MRI で生成されたコードを利用しました。生成されたコードほとんどそのままでクラス定義と関数定義をいじっただけです。
行番号表示/非表示切替
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) {
e1.printStackTrace(System.err);
} catch (IndexOutOfBoundsException e2) {
e2.printStackTrace(System.err);
}
}
}
|
コンパイルする 
IDE を使っているのであれば上記四つの jar ファイルをクラスパスに含めてコンパイルしてください。地道にコンパイルする場合でもクラスパスに含めます。
jar ファイルにまとめる 
ここではクラスファイルは一つなのでまとめずに使用します。
parcel-descriptor.xml ファイルを書く 
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>
|
配置する 
user/Scripts/CalcMacro ディレクトリを作成、CalcMacro.class および parcel-descriptor.xml ファイルを入れておきます。
実行 
Calc を起動、ツール - マクロ - マクロの実行から CalcMacro/CalcMacro.do_something を実行します。
ドキュメントのマクロ 
ドキュメントに 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 のマクロが削除されてしまいます。