PythonでLibreOfficeのマクロ(1)-使い方と簡単なサンプルコード

記事公開日:
最終更新日:

This post is also available in: English-US (英語)

LibreOfficeでのマクロ開発を受注した際に調べた内容を、記事として整形して公開しています。
主にWindows環境にてPythonを使った、Calcでのマクロを中心とした内容となっています。

LibreOfficeの起動とかの動作は、昔のOpenOfficeよりもけっこう早いです。
昔のOpenOfficeは動作がもっさりしていました。

Calcでのセキュリティの設定

Calcを起動>ツール>オプション と移動します。
そして、取り急ぎ下記の画像のようにセキュリティの設定を行います。

libre1-001

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 と移動して、サンプルのマクロスクリプトを実行してみます。

libre1-003

普通のサンプルスクリプトを走らせても面白くないので、サンプルを参考にして 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 None
No tags for this post.

About
Amelt.net,LLCの創業者で、費用対効果の高い統合webマーケティングによりビジネスパートナーとして継続的にサポート。詳しいより。ブログの更新情報TwitterLinkedIn、またRSSfeedlyにてお知らせしていますのでフォローよろしくお願い致します。