This post is also available in: English-US (英語)
LibreOfficeでのマクロ開発を受注した際に調べた内容を、記事として整形して公開しています。
主にWindows環境にてPythonを使った、Calcでのマクロを中心とした内容となっています。
LibreOfficeの起動とかの動作は、昔のOpenOfficeよりもけっこう早いです。
昔のOpenOfficeは動作がもっさりしていました。
Calcでのセキュリティの設定
Calcを起動>ツール>オプション と移動します。
そして、取り急ぎ下記の画像のようにセキュリティの設定を行います。
JRE(Java Runtime Environment)のインストール
ツール>マクロ>マクロの管理>Python と移動して、サンプルのスクリプトをテストで走らせてみます。
環境によっては、以下のようなエラーが出るかもしれません。
このタスクを実行するには、LibreOfficeにJava Runtime環境(JRE)が必要です...etc
最新のJREで問題ないようなので、JREをインストールします。
既にJREがパソコンにインストールされている場合には、JREのバージョンを選択する事になりますが、私の開発環境では複数のJREがインストールされていたので、 ツール>オプション> LibreOffice>詳細 からJREのバージョンを選択しました。
JREのバージョンは 1.8 ではエラーが出て 1.7 で問題なく動きました。JREのインストールパスは64bit環境でしたので Program Files(x86) です。
Pythonのサンプルのマクロを実行
ツール>マクロ>マクロの管理>Python と移動して、サンプルのマクロスクリプトを実行してみます。
普通のサンプルスクリプトを走らせても面白くないので、サンプルを参考にして gettoday.py を作って、以下のフォルダパスにコピーして、ツール>マクロ>マクロの管理>Python と実行すると、結果がCalcに表示されると思います。
サンプルのスクリプトは、デフォルトのインストール環境であれば以下のフォルダパスにあります。
C:\Program Files (x86)\LibreOffice 5\share\Scripts\python
#gettoday.py import sys import datetime def PrintToday( ): #get the doc from the scripting context which is made available to all scripts desktop = XSCRIPTCONTEXT.getDesktop() model = desktop.getCurrentComponent() #check whether there's already an opened document. Otherwise, create a new one if not hasattr(model, "Sheets"): model = desktop.loadComponentFromURL( "private:factory/scalc","_blank", 0, () ) #get the XText interface sheet = model.Sheets.getByIndex(0) #create an XTextRange at the end of the document tRange = sheet.getCellRangeByName("A2") #and set the string tRange.String = "Today is (in Python) " + str(datetime.date.today()) + " !!" #do the same for the python executable path tRange = sheet.getCellRangeByName("A3") yesterday = datetime.date.today() - datetime.timedelta(1) tRange.String = "Yesterday was (in Python) " + str(yesterday) + " !!" return None
同様にして、ツール>マクロ>マクロの管理>Python とCalcから実行して、LibreOffice Writer に結果を出力する場合には以下のようなマクロスクリプトとなります。
#gettoday-writer.py import sys import datetime def PrintToday( ): #get the doc from the scripting context which is made available to all scripts desktop = XSCRIPTCONTEXT.getDesktop() model = desktop.getCurrentComponent() #check whether there's already an opened document. Otherwise, create a new one if not hasattr(model, "Text"): model = desktop.loadComponentFromURL( "private:factory/swriter","_blank", 0, () ) #get the XText interface text = model.Text #create an XTextRange at the end of the document tRange = text.End #and set the string tRange.String = "Today is (in Python) " + str(datetime.date.today()) + " !!" return NoneNo tags for this post.