前回と違うメソッドを使って同じことをする。
成果物
コード
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を使えるため条件分岐が不要になって便利かも。
scalc
をswriter
に変えるとWriter文書を作成できるっぽい。一覧
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release 学習まとめ
- LibreOffice 6.1.5.2 ※
$ uname -a Linux raspberrypi 4.19.97-v7l+ #1294 SMP Thu Jan 30 13:21:14 GMT 2020 armv7l GNU/Linux