やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

LibreOfficeCalcのファイルを新規作成するPythonマクロ2

 前回と違うメソッドを使って同じことをする。

成果物

コード

run.sh

soffice --calc --norestore "--accept=pipe,name=librepipe;urp;" & {
    sleep 3
    ./new_doc.py
    jobs
    kill %%
}

new_doc.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import uno
import unohelper
from pythonscript import ScriptContext
import os.path
import datetime

def connect_script_context(host='localhost', port='2002', namedpipe=None):
    UNO_RESOLVER = "com.sun.star.bridge.UnoUrlResolver"
    UNO_DESKTOP = "com.sun.star.frame.Desktop"
    localCtx = uno.getComponentContext()
    localSmgr = localCtx.ServiceManager
    resolver = localSmgr.createInstanceWithContext(UNO_RESOLVER, localCtx)
    if namedpipe is None:
        uno_string = 'uno:socket,host=%s,port=%s;urp;StarOffice.ComponentContext' % (host, port)
    else:
        uno_string = 'uno:pipe,name=%s;urp;StarOffice.ComponentContext' % namedpipe
    ctx = resolver.resolve(uno_string)
    smgr = ctx.ServiceManager
    XSCRIPTCONTEXT = ScriptContext(ctx,
                                   smgr.createInstanceWithContext(UNO_DESKTOP, ctx),
                                   None)
    return XSCRIPTCONTEXT

XSCRIPTCONTEXT = connect_script_context(namedpipe='librepipe')
desktop = XSCRIPTCONTEXT.getDesktop()
doc = desktop.loadComponentFromURL('private:factory/scalc', '_blank', 0, ())
#doc = desktop.getCurrentComponent()
sheet = doc.getSheets().getByIndex(0)
sheet.getCellByPosition(0,0).Value = 1234

now = datetime.datetime.now()
timestamp = now.strftime('%Y%m%d%H%M%S')
file = os.path.join(os.path.dirname(os.path.abspath(__file__)), timestamp + '.ods')
url  = unohelper.systemPathToFileUrl(file)
doc.storeToURL(url, ())

 前回との違いは一箇所のみ。

before

doc = desktop.getCurrentComponent()

after

doc = desktop.loadComponentFromURL('private:factory/scalc', '_blank', 0, ())

 両方とも同じことができる。loadComponentFromURLは既存のファイルを読込するときに使うAPIだが、第一引数をprivate:factory/scalcにすることで新規作成するようになる。同じAPIを使えるため条件分岐が不要になって便利かも。

 scalcswriterに変えるとWriter文書を作成できるっぽい。一覧

対象環境

$ uname -a
Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux