LibreOfficeのPythonマクロを使う

プログラミング

LibreOfficeのPythonマクロを使う

LibreOfficeのPythonマクロを使うためのメモです。

Basicマクロは、普通に使えますがPythonのマクロはどこからどうやって使えばいようのかわからないという方もいるのではないでしょうか。

そのような方の為に、エディターの設定方法やマクロの保存場所や拡張機能の設定などを説明します。

この文章を読んでいただければ、LibreOfficeでPythonのマクロを使うための基本的な知識が身につくと思います。

拡張機能の設定 APSO

まずは、APSOと拡張機能をインストールします。

今回はCalcを起動して、「ツール」→「拡張機能の管理」→「ほかの拡張機能をオンラインで追加」をクリックするとブラウザから拡張機能のダウンロードページが開きます。

ここで「APSO」を検索してダウンロードします。

「ツール」→「拡張機能の管理」→「追加」でダウンロードした拡張機能を選択してインストールします。

APSO

「ツール」→「拡張機能の管理」で「APSO」を選択して「オプション」をクリックします。

ここでエディタのパスを設定します。私はVSCodeを使っているので、VSCodeのパスを設定しました。

APSO Optins

APSOがインストールされると、LibreOfficeに 「ツール」→「マクロ」→「Pysonスクリプトの管理」が追加されます。

「マクロの管理」と言う項目にも「Python」と言う項目があって一見何か出来そうですが、ボタンがグレーアウトされていて何もできないようです。
※APSOは、インストールした後すぐに拡張機能の設定画面から「更新の確認」ですぐにアップデートしてください。メニューが表示されないことがあります。

マクロの保存場所

Pythonに限らずLibreOfficeのマクロは、大まかに3種類あります。
さらに、サーバーモードでLibreOfficeを起動すればUnoブリッジを利用して外部からマクロを実行することもできます。

3種類のマクロ

    1. 個人用マクロユーザーごとに保存されるマクロです。ユーザーごとにマクロを保存できるので、他のユーザーに影響を与えることがありません。保存場所は、ユーザーディレクトリの「C:\Users\%USERNAME%\AppData\Roaming\LibreOffice\4\user\Scripts\python」です。このディレクトリに「user」ディレクトリを作成して、その中に「Scripts/python」ディレクトリを作成します。このディレクトリにPythonのマクロを保存すると、LibreOfficeの「マクロ」→「マクロの実行」でマクロを実行できます。
    2. 共有マクロ全ユーザーが共有できるマクロです。LibreOfficeのインストールディレクトリに保存されます。保存場所は、インストールディレクトリの「C:\Program Files\LibreOffice\share\Scripts\python」です。
    3. ドキュメントマクロドキュメントごとに保存されるマクロです。ドキュメントに埋め込まれるので、ドキュメントを移動してもマクロが消えることはありません。保存場所は、文章中に埋め込まれるので(一時ファイルを作っているようですが)特にありません。しかし、ここでちょっと問題がありまして、エディタでマクロの内容は開かれるのですが保存をしても変更がなぜか反映されません。ですので、個人用のマクロとしてマクロを作成し、埋め込みにしたい場合は「メニュー」ボタンを押して「埋め込み」を選択するとマクロが埋め込みに移動します。LibreOfficeのPythonマクロは、Windowsの場合はインストール時にPythonがLibreOfficeのインストールディレクトリに用意されています。その環境を使って動作するので、Pipなどでモジュールを追加した場合埋め込みにしたマクロは動作しないかもしれません。埋め込みにした場合は、その点を注意してください。

    Python MACRO

    Pythonマクロの作成

    注意事項

    APSOを入れたら「Pythonスクリプトの管理から」モジュールを追加してスクリプトを作成します。

    この時に、フォルダの様なアイコンがスクリプトファイルでその下に関数名が表示されます。

    この関数名を選択していると何を編集しようとしてもエラーが出るだけなのでご注意ください。

    フォルダの様なアイコン(モジュール名)を選択して編集してください。

    pipのインストール

    Pythonのモジュールをインストールするにはpipを使います。

    pipはPythonのパッケージ管理ツールです。

    しかし、LibreofficeのPythonはpipがインストールされていないのでget-pip.pyでインストールする必要があります。

    get-pip.pyは、https://bootstrap.pypa.io/get-pip.py からダウンロードできます。

    ダウンロードしたら、PowerShellの画面からLibreOfficeのPython環境へパスを通します。

    $env:PATH = "C:\Program Files\LibreOffice\program;" + $env:PATH

    次に、get-pip.pyを実行します。

    python get-pip.py

    これでpipがインストールされました。

    pipを使ってモジュールをインストールするには、PowerShellの画面から次のようにします。

    python -m pip install モジュール名

    警告が出ることが多いようですが問題は、無いようです。

    多分、’C:\Users\%USERNAME%\AppData\Roaming\Python\Python39\Scripts’にパスが通っていないという警告だと思います。

    気になるようでしたら、パスを通してください。

    使えないモジュール

    試してみたところPnadasは、使えました。

    下の画像で左側の住所録データを範囲指定してPandasに取り込み統計情報をセルに書き込みました。

    画像右側の反転領域がPandasが表示した情報です。Fakerで作ったデータなので知りませんでしたが”山本 さゆり”さんのデータがダブっているのが分かりました。

    use pandas

    tkinterは、ふつうは標準のモジュールとして用意されているのですが、LibreOfficeのPythonには入っていないようです。

    pipからは入れられませんでしたが、手動で設定してあげれば使えるかもしれません。

    PyQt6は、多分メインのスレッドで動かさなければならないということで終了するまで処理が戻ってこなかったりするのでちょっと使えなさそうです。

    インプットボックスとボタンを用意してテキストを入力してボタンを押すとセルの文字が書き換わる予定でしたがボタンを押してPyQt6の画面を終了するまでセルが書き換わりませんでした。工夫すれば使えるのかもしれませんがメインスレッドから使わないと不慮のエラーが出る可能性があるかもと言うことなので使わないのが無難で消化。

    方法があるかもしれませんが、検証してないのでわかりません。

    その他、使えないモジュールがあるかもしれません。

    LibreOfficeのPython自体も少しだけ古いのでバージョンが合わないものもあるかもしれません。

    このような感じなのでなるべく標準のモジュールを使うようのがいいかもしれません。

    Pythonマクロの作成

    「ツール」→「マクロ」→「Pythonスクリプトの管理」を選択します。

    「マイマクロ」を選択して「モジュールの作成」でモジュールを作成します。

    モジュールを選択して「編集」でエディタが開くのでマクロを作成することができます。

    マクロを作成したら「保存」で保存します。

    マクロの実行

    マクロを実行するには、「マクロ」→「マクロの実行」でマクロを実行します。

    マクロの簡単な例

    セルに文字を表示

    # coding: utf-8
    from __future__ import unicode_literals
    
    def write_to_cell():
        # 現在のドキュメントにアクセス
        doc = XSCRIPTCONTEXT.getDocument()
        
        # 最初のシートにアクセス
        sheet = doc.Sheets.getByIndex(0)  # 0はシートのインデックスです(最初のシート)
        
        # セルに書き込み (例: A1セル)
        cell = sheet.getCellByPosition(10, 10)  # (0, 0) はA1セルの位置
        cell.String = "テスト書き込み"
    

    Pandasを使う

    # coding: utf-8
    from __future__ import unicode_literals
    
    import pandas as pd
    
    def analyze_address_book():
        # 現在のドキュメントにアクセス
        doc = XSCRIPTCONTEXT.getDocument()
        
        # 最初のシートにアクセス
        sheet = doc.Sheets.getByIndex(0)  # 0はシートのインデックスです(最初のシート)
        
        # セルの範囲を取得
        cell_range = sheet.getCellRangeByPosition(0, 0, 3, 102)  # (0, 0) から (3, 102) までのセル
        
        # セルの値を取得
        data = []
        for row in cell_range.DataArray:
            data.append(row)
        
        # データをDataFrameに変換
        df = pd.DataFrame(data)
        df_description = df.describe()  # 統計情報を取得
        
        # 統計情報をシートに書き込む
        start_col = 5
        start_row = 1
        
        for i, col in enumerate(df_description.columns):
            # カラム名を書き込む
            cell = sheet.getCellByPosition(start_col + i + 1, start_row)
            cell.String = col
        
        for i, row in enumerate(df_description.index):
            # インデックス名を書き込む
            cell = sheet.getCellByPosition(start_col, start_row + i + 1)
            cell.String = row
            
            for j, value in enumerate(df_description.loc[row]):
                # 値を書き込む
                cell = sheet.getCellByPosition(start_col + j + 1, start_row + i + 1)
    
                if isinstance(value, (int, float)):
                    #cell.CellBackColor = 0x00FF00  # 緑で書き込む
                    cell.Value = float(value)  # LibreOfficeは数値をfloatとして扱います
                elif isinstance(value, str):
                    #cell.CellBackColor = 0x0000FF  # 青色で書き込む
                    cell.String = value  # 文字列の場合はStringプロパティを使用
                elif value is None:
                    #cell.CellBackColor = 0x000FF0  # 何色だろ?で書き込む
                    cell.String = ""  # Noneの場合は空文字列を設定
                else:
                    #cell.CellBackColor = 0xFF0000  # 赤色で書き込む
                    cell.Value = int(value)  # その他の型は文字列に変換
    

    サーバーモード

    サーバーモードでLibreOfficeを起動すると、Unoブリッジを利用して外部からマクロを実行することができます。

    サーバーモードでLibreOfficeを起動するには、PowerShellなどから次のようにします。

    soffice --calc --accept="socket,host=localhost,port=2002;urp;"
    soffice --calc --headless --accept="socket,host=localhost,port=2002;urp;" #ヘッドレスモード

    詳しくは、「LibreOfficeを使って印刷物(PDF)を作る方法 概要 1/4」を参照してください。

    サーバーモードでLibreOfficeを起動すると、Unoブリッジを利用して外部からマクロを実行することができます。

    まとめ

    LibreOfficeのPythonマクロを使うための基本的な知識を説明しました。

    APSOを使ってエディタの設定やマクロの保存場所や拡張機能の設定などを説明しました。

    Pythonのモジュールをインストールするにはpipを使いますが、LibreOfficeのPythonにはpipがインストールされていないのでget-pip.pyでインストールする必要があります。

    Pythonのモジュールは、標準のモジュール以外を使うと少し工夫が必要かもしれませんが割と使えるようです。

    サーバーモードでLibreOfficeを起動すると、Unoブリッジを利用して外部からマクロを実行することができます。

    LibreOfficeのPythonマクロを使うための基本的な知識が身についたと思います。

    LibreOfficeのPythonマクロを使って、便利なマクロを作成してください。

Commnts