Python で OpenOfficeマクロ

ダイアログ・エディタの利用とコード上でのイベント関連づけ

目次

前置き

Pythonでダイアログのイベント操作をおこなうOOoマクロのサンプルには、 OOo scripting framework and pythondynamicDialog.py があるの ですが、ダイアログのレイアウトをコード内部でいちいち記述しているのが気 に入りません。

OOoBASICでは、 DevelopersGuideBasics and Dialogs で解説されて いるような、「ダイアログ・エディタで作成したGUIを呼び出して利用する」 のが普通なようです。PythonでOOoマクロを記述する場合も、OOoBASICの場合 と同様に、ダイアログ・エディタを利用した「楽なGUI」をやりたいものです。

このテキストでは、OpenOfficeに付属しているダイアログ・エディタで作成し たGUIを利用するOOoマクロをPythonで作成します。ただし、イベントの関連付 けだけはコード内部に記述します。

UNO経由でのOOoの操作は言語によらずほぼ同じ手順です。ダイアログ操作を伴 うOOoマクロをJavascriptなどで作成する際にも、この文書が参考資料として 役立つとおもいます。

実際の手順

ダイアログの作成

OpenOffice.org Calc を立ち上げます。

メニュー・バーの「ツール(T)」→「マクロ(M)」→「ダイアログの管理(D)」 をクリック。「OpenOffice.org BASIC マクロの管理」というウィンドウが表 示されます。

「ツール(T)」→「マクロ(M)」→「ダイアログの管理(D)」

「マイダイアログ」→「Standard」を選択(クリック)して、「新規作成 (N)」ボタンをクリック。ダイアログ名の入力を求める「新しいダイアログ」 という小さいウィンドウが表示されます。

「simpleDialog」という名前の新しいダイアログを作成する

「新しいダイアログ」の「名前(N)」欄に「simpleDialog」と 入力して「OK」を押します。「マイダイアログ」→「Standard」の下に 「simpleDialog」という項目が作成されます。

「simpleDialog」を選択して「編集」ボタンを押します。

「マイダイアログ」→「Standard」の下にある「simpleDialog」を選択して 「編集」ボタンを押す。「マイマクロ & ダイアログ.Standard - OpenOffice.org BASIC」という名前のウィンドウが表示されます。

ユーザー・ダイアログの作成画面

ツールボックスから、「コマンドボタン」 commandbutton_icon を選択し、 ダイアログにボタンを作成。ドラッグアンドドロップした大きさでボタンが作 成されます。

ダイアログに作成したボタンをダブルクリック。ボタンのプロパティ・ダイア ログ「プロパティ: CommandButton」が表示されます。

「プロパティ: CommandButton」の「名前」欄を「CommandButton1」に設定。 (※デフォルトで「CommandButton1」のはずなので書き換える必要ないかも) 名前を設定したら「プロパティ: CommandButton」を閉じる。

ボタンのプロパティ。「名前」に「CommandButton1」を設定。

同様に、ダイアログへテキスト・フィールドを追加します。 ツールボックスから、「テキスト・フィールド」 textfield_icon を選択し、 ダイアログに作成。作成したテキストフィードをダブルクリックしてプロパ ティ・ウィンドウを開く。名前欄に「TextField1」を設定した後、プロパティ・ ウィンドウを閉じる。

テキスト・フィールドのプロパティ。「名前」に「TextField1」を設定。

ボタンとテキストフィールドの追加が完了したら、ダイアログを保存します。 ダイアログを保存するには、ツールバーにあるフロッピーディスクのアイコン notsaved_icon をクリックします。ダイアログの保存が完了すると、 saved_icon のような灰色をしたフロッピーディスク・アイコンに変わります。

フロッピーディスクのアイコンを押して、デザインしたダイアログを 保存する。

ダイアログ・エディタでの操作はこれで終了。マクロから呼び出すダイアログ が完成しました。

まとめ

このセクションでやったこと。

  • ダイアログ「simpleDialog」を作成。場所は「マイダイアログ」→ 「Starndard」以下
  • ダイアログ上にボタンを配置。名前は「CommandButton1」
  • ダイアログ上にテキスト・フィールドを配置。名前は「TextField1」
  • ダイアログのデザインが完成したら保存する。

マクロコードの記述

マクロコードを記述したPythonファイルを保存するために、 「C:\Documents and Settings\ユーザー名\Application Data\OpenOffice.org2\user\Scripts」 以下に「python」フォルダを作成します。(以下: Scriptpythonフォルダと呼 ぶ)

Script以下にpythonフォルダを作成して、pythonコードを配置する。

以下のスクリプトを、「 simpledialog_test.py 」という名前で Scriptpython フォルダ に保存します。めんどうな場合は、 simpledialog_test.py をダウンロードして Scriptpython フォルダ へ保存してください。:

import uno
import unohelper
from com.sun.star.awt import XActionListener

class MyActionListener( unohelper.Base, XActionListener ):
    def __init__(self, oControl):
        self.nCount = 0
        self.objectControl = oControl

    def actionPerformed(self, actionEvent):
        # increase click counter
        self.nCount = self.nCount + 1;
        self.objectControl.setText( str( self.nCount ) )

def createDialog():
    """This is how to call a Basic dialog"""
    dialog_name = "simpleDialog"

    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    dp = smgr.createInstance("com.sun.star.awt.DialogProvider")
    dlg_control = dp.createDialog("vnd.sun.star.script:Standard."+dialog_name+"?location=application")


    tf1_control = dlg_control.getControl( "TextField1" )
    tf1_control.setText("hogehoge!")
    btn1_listener = MyActionListener( tf1_control )

    # add the action listener
    cmdbtn1_control = dlg_control.getControl("CommandButton1")
    cmdbtn1_control.addActionListener(btn1_listener)

    # execute dialog
    dlg_control.execute()
    dlg_control.dispose()
    return None


g_exportedScripts = createDialog,

マクロの保存形式: ファイル・エンコーディングに注意

OpenOfficeは LF改行 のファイルしか受け付けない (※ OOo scripting framework and python の "Script coding" を参照)。したがって改行コー ドは、 必ず LF で保存すること。 Pythonマクロの編集にwindowsのメモ帳 を使ってはいけません。 メモ帳で保存してしまうと、改行コードが CR+LF になってしまうので注意!

コメントなどで日本語等の2byte文字を使用する場合、文字コードにも注意す ること。OpenOffice付属のPython2.3.4は、euc-jpに対応していない。 shift_jisはmbcsとして読み込んでくれそうだが、「shift_jis + LF改行」と いう組み合わせはかなりイレギュラーなので使わない方がいい。2byte文字を 含める場合は、ファイルの縁コーディングを「utf-8 + LF改行」にするのが無 難だと思う。emacsの場合「utf-8-unix」で保存するのがいいだろう。

まとめ

このセクションでやったこと。

  • マクロファイルは 「C:\Documents and Settings\ユーザー名\Application Data\OpenOffice.org2\user\Scripts\python」 に置く。
  • 改行コードに注意。必ず LF改行 で保存する。

マクロの実行

メニュー・バーの「ツール(T)」→「マクロ(M)」→「マクロを実行(U)」 をクリック。「マクロの選択」ダイアログが表示されます。

「ツール(T)」→「マクロ(M)」→「マクロを実行(U)」
「マクロの選択」ダイアログ

マクロの選択ダイアログの「ライブラリ(A)」から、「マイマクロ」→ 「simpledialog_test」を選択すると、「マクロ名(B)」に「createDialog」が 表示されます。次に、「createDialog」を選択して「実行ボタン」を押します。

うまくいっていれば、 ダイアログの作成 のセクションで作成・保存した ダイアログ「simpleDialog」が表示されているはずです。

simpleDialog

ボタンを押してみましょう。ボタンを押すたびにテキストフィールドに表示さ れている数字が 1,2,3,4,5… と増加する事が確認できれば成功です。

CommandButton1 を押すと TextField1 の数字がカウントアップされる。