長年…といっても、半月ほどですが、懸念であった 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 呼び出し
あたりが可能です。このあたりは、別途ためしてみる予定。
