Calc(47)埋め込みマクロのためのPyDevプロジェクト

2017-12-18

旧ブログ

t f B! P L
ドキュメントに埋め込んだマクロを出し入れするスクリプトを作成しました。PyDevプロジェクトはEclipse: PyDevメモ: LibreOfficeのPythonマクロのデバッグの手順に沿って作成した環境にあるものとします。

前の関連記事:Calc(46)シートをファイルに切り出すマクロ


埋め込みマクロを編集するためのPyDevプロジェクト


p--q/EditEbeddedScripts

このプロジェクトにあるCalcDoc.odsに埋め込みマクロを出し入れします。

読み書きする対象のCalcドキュメントは一つだけです。

書き込むマクロをsrcフォルダ下に用意します。

このフォルダがドキュメント内のルートに相当します。

Pythonマクロの場合はsrc/Scripts/pythonフォルダにpyファイルを置くことになります。

このpyファイルからインポートするモジュールはpythonpathフォルダに入れます。
(2017.12.24追記。埋め込みマクロではうまくインポートできないことがわかりました。LibreOffice5(116)埋め込みマクロからPythonモジュールをロードする方法参照。)

pythonpathフォルダはマクロセレクターからはみえませんが、それ以外のフォルダはマクロセレクターではライブラリとして見えます。

埋め込みマクロを書き込むreplaceEmbeddedScripts.py


(2017.12.20追記LibreOffice5(113)埋め込みマクロフォルダを読み書きする方法:まとめの4-1ドキュメントのパッケージに書き込むの方法で埋め込んだマクロはCalcドキュメントを編集して保存すると消えてしまうことがわかりましたので修正しました。)

toolsフォルダのreplaceEmbeddedScripts.py 

SimpleFileAccessのcopy()で、file://からvnd.sun.star.pkgへフォルダをコピーしています。

SimpleFileAccessのcopy()では、ドキュメント内のScripts/pythonフォルダがmanifest.xmlに登録されないので、SipleAccessのcreateFolder()でまずドキュメント内のScripts/pythonフォルダを作成しています。

LibreOfficeでドキュメントを開いているときはドキュメントを保存して閉じてから、3-1の方法でマクロを書き込み、マクロを有効化してドキュメントを開き直しています。

(2018.2.12追記。LibreOfficeを完全に終了しないと更新したマクロが反映されないことがありました。とくにリスナーのメソッドはLibreOfficeに読み込まれたらLibreOfficeを終了するまで軽微な変更が反映されないようです。なので埋め込みマクロを更新したときはLibreOfficeを再起動したほうがよいです。)

__pycache__フォルダやpycファイルもドキュメント内に書き込まれてしまいます。

埋め込みマクロフォルダを丸ごと置換したいので、事前にドキュメントのパッケージを取得してScripts/pythonフォルダを削除しています。

開いていないドキュメントのフォルダはSimpleFileAccessのkill()では削除できませんでした。

埋め込みマクロを読み取るgetEmbeddedScripts.py


toolsフォルダのgetEmbeddedScripts.py 

ドキュメントをLibreOfficeで開いているときはLibreOffice5(113)埋め込みマクロフォルダを読み書きする方法:まとめの1-1の方法で、SimpleFileAccessのcopy()で、vnd.sun.star.tdocからfile://へフォルダをコピーしています。

ドキュメントを開いていないときはLibreOffice5(113)埋め込みマクロフォルダを読み書きする方法:まとめの2-5ドキュメントのパッケージの各インプットストリームを取得してSimpleFileAccessのwriteFile()で書き出す方法で読み取っています。

読み取ったマクロフォルダはsrc/Scripts/pythonに書き出します。

既存のフォルダを消してから書き込むので、既存のフォルダを消す前に消すかどうか尋ねるようにしています。

書き込むマクロの例embeddedmacro.py 



これは書き込むマクロの例です。

シートをダブルクリックしたとき(Calc(27)ドキュメント内のすべてのシートでクリックを補足する)と、右クリックしたときのコンテクストメニュー(Calc(40)コンテクストメニューをカスタマイズする: その8)をカスタマイズするマクロが載っています。

ダブルクリックしたときのコードは何も書き込んでいません。

embeddedmacro.pyを実行するとコンテクストメニューはデフォルトのコンテクストメニューの項目が削除されていることがわかります。

embeddedmacro.pyを実行するには、次の3つの方法があります。

埋め込みマクロとして実行

マクロセレクターからCalcDoc.odsに埋め込んだembeddedmacro.pyを呼び出します。

マイマクロとして実行

マクロセレクターからPyDevパッケージ内のsrc/Scripts/pythonにあるembeddedmacro.pyを呼び出します。
(PyDevパッケージがマイマクロフォルダにあることが必要です。)

オートメーションで実行

embeddedmacro.pyをLibreOfficeのバンドルPythonをインタープリターとして実行します。

ただ、オートメーションは制約が多く、EnhancedMouseClickHandlerもContextMenuInterceptorも実行できません。

if __name__ == "__main__"以降はオートメーションで実行するためのコードです。

pythonpathフォルダにあるforautomation.pyの関数automation()でLibreOfficeを起動して、CalcDoc.odsのドキュメントモデルを取得してembeddedmacro.pyを実行しています。

embeddedmacro.pyのデバッグはenableRemoteDebuggingデコレーターを使うようにしています。

マクロとして実行するときと、オートメーションとして実行するときとでは、pythopathフォルダ内のモジュールのインポートパスが異なります。

マクロとして実行するときはpythopathフォルダ内のモジュールをそのまま呼び出せます(LibreOffice5(47)拡張機能のソースをオートメーションでも実行するの「マクロモードで実行するのは断念」)。

オートメーションとして実行するときはパスのとおりpythopathフォルダからドットを付けてモジュールを呼び出しています。

次の関連記事:Calc(48)ドキュメントイベントを調べる

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ