LibreOffice の Python macro で pip を使う

長年…といっても、半月ほどですが、懸念であった LibreOffice の Python マクロで pip を使える方法がわかりました。

moonmile/ExcelLikeUno: LibreOffice の Python マクロを Excel VBA ライクに操作 https://github.com/moonmile/ExcelLikeUno

というか、普通に LibreOffice Python が使っているところに pip できます。

& 'C:\Program Files\LibreOffice\program\python' -m pip install excellikeuno

このように LibreOffice が使っている Python を -m スイッチを付けてインストールすると以下のフォルダに配置されます。

C:\Users\masuda\AppData\Roaming\Python\Python311\site-packages\

共有の Program Files 配下には入れられないので、代わりにユーザーの AppData の中に入ります。現在の LibreOffice Python は 3.11 を使っているので、Python311 フォルダーになります。将来的にバージョンが変わると、ここも変わる可能性は大です。

これで、Calc のマクロからも excellikeuno パッケージが参照できるようになるので、以下のように書けます。

"""LibreOffice Calc sample macro."""
from re import X
from typing import Any, Tuple
from excellikeuno import connect_calc_script
from excellikeuno.table.sheet import Sheet 

def hello_to_cell():
    ( _, _, sheet ) = connect_calc_script(XSCRIPTCONTEXT)
    sheet.cell(0, 0).text = "Hello Excel Like for Python!"
    sheet.cell(0, 1).text = "こんにちは、Excel Like for Python!"
    sheet.cell(0,0).column_width = 10000  # 幅を設定

    cell = sheet.cell(0,1)
    cell.CellBackColor = 0x006400  # 濃い緑に設定
    cell.CharColor = 0xFFFFFF  # 文字色を白に設定

g_exportedScripts = (
    hello_to_cell,
)

XSCRIPTCONTEXT の接続部分を隠蔽化させるために、connect_calc_script 関数を使って sheet を取得します。このあたりは、もっと簡素化して Excel VBA のように ActiveWorksheet, ActiveWorkbook として取得できるようにする予定です。

Python マクロ自体は、以下に保存されているので vscode で編集することができます。

C:\Users\{ユーザー名}\AppData\Roaming\LibreOffice\4\user\Scripts\python\

ただし、このままだと vscode のコード補完が効かない、パッケージのコード補完が効かないので Scripts/python/.vscode/settings.json を作成します。

{
    "python.analysis.autoImportCompletions": true,
    "python.analysis.extraPaths": [
        "C:/Users/masuda/AppData/Roaming/Python/Python311/site-packages"
    ]
}

“python.analysis.extraPaths” に、先の site-packages フォルダーを設定しておきます。

そうすると、ExcelLikeUno パッケージで定義してある Sheet クラスなどで、コード補完が働くようになります。

これだと、uno api 単体よりははるかにコーディングしやすいし、VBA オプションを付けたかんじで Excel VBA 風にコーディングができるはずです。

あとは、Excel VBA と uno api の対応表を作りながら、ちまちまとクラス設計をしていけば良いはず。uno api のほうが Java 的に綺麗に整理されはいるのだけれど、Excel VBA の構造に慣れていると、いまいち発想が届かないのです。まあ、いったん、Excel VBA に直してから、あらためて UNO api 風に戻していけばよいかなと。

ところで LibreOffice Python でも自由に pip ができる(多分、仮想環境では無理だろうけど)ことがわかったので、通常の pip パッケージも Calc 内部から使えるはずです。

  • OpenAI 関係の API を呼び出し
  • PyNum 関係で数式を使ってグラフを作成
  • Python マクロ内から Web API 呼び出し

あたりが可能です。このあたりは、別途ためしてみる予定。

カテゴリー: 開発, LibreOffice, python パーマリンク