久ぶりのPythonの話題である。
LibreOfficeはそのマクロをPythonで書くことができるが、pythonが元々機能として持っていたprint文などがそのままでは使えない。このままではユーザインタフェースやデバッグ機能に欠けた状況でPythonマクロはあまり魅力的ではない。
調べてみるとprint文などに対応するユーザフェース機能をマクロが使うモジュールとして用意することできることがわかった。少し面白くなった。まずマクロのサンプルを示す:
import uno
import screen_io as ui
def my_first_macro_calc():
doc = XSCRIPTCONTEXT.getDocument()
for num, column in enumerate(['A1', 'A2', 'A3']):
cell = doc.Sheets[0][column]
cell.Value = num
ui.Print('OK?')
return
このマクロの保存場所は(windowsの場合)
C:\Users\~~\AppData\Roaming\LibreOffice\4\user\python
である。
これはLibreOfficeの表計算ソフトCalcのシート番号0のシートの’A1’欄に数値0、’A2’欄に数値1、’A3’欄の数値2を入れる簡単なマクロである。
ui.Print(‘OK’)は数値を書き込む毎に警告窓を出す。ここではデバッグ機能として使っている。この関数Printはscreen_ioモジュールで定義されていて、import screen_io as uiとしてインポートされてされている。import unoがシステムモジュールのインポートであるのに対してimport screen_ioはユーザモジュールのインポートである。このモジュールのの実体はここにある。このモジュールの保存場所は
C:\Users\~~\AppData\Roaming\LibreOffice\4\user\python\pythonpath
である。
このモジュールはbasic言語で作ったモジュールのラッパーらしい。このbasic言語のモジュールの実体もここにある。このモジュールも保存する。保存する場所はLibreOfficeのプルダウン・メニュのマクロで
マイマクロ->standard->module1と進み、編集ボタンで編集画面になるので実体をペーストし、保存する(モジュール名をuiScriptsとすることを忘れないで)。
以上でPrint関数を含むマクロを実行できる環境ができあがった。
最後にPrint関数の実行結果の画面を示す:
【蛇足】pythonでマクロを書くときの注意:
- indentはTabキーではダメで半角スペースを使う。
- Pythonでよく使うprint文は使えない
- 登録しようとしているマクロに構文エラーがあるとマクロの登録すらできない。しかもその構文エラーを知る手掛りがない