Python で OpenOfficeマクロ

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

目次

前置き

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

OOoBASICでは、 DevelopersGuide の Basics 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 の数字がカウントアップされる。