まずは、calc を操作してみます。
操作は単純で、A1 のセルに数字をだすだけです。windows で試しています。
準備としては、まずは、新規calc を立ち上げます。
マクロ
自作マクロのところに、下記を書いたpython スクリプトをいれてください。
def a1():
doc = XSCRIPTCONTEXT.getDocument()
sheet = doc.getSheets().getByName('Sheet1')
A1 = sheet.getCellRangeByName('A1')
A1.Value = 100
ツール→マクロ→マクロの管理→python→該当スクリプト→a1 を実行します。A1に、
100 が入ります。
外部から操作する
マクロだとデバッグが大変なので、外部から、python のスクリプトをつかって操作できるようにします。今のところ、windows では、事実上、LibreOffice 付属のpythonしかつかえません。Mac ,Ubuntu でも状況は同じらしいです。つまり、自由にモジュールを追加できないので、かなり不便だということです。
(準備)
- python は、LibreOffice 付属を使う(他のpython とは競合しないようにする)
- path を、LibreOffice の python に通す。
- libreoffice を 操作可能な状態で**起動(次に説明)**する
(起動)
下記のようにオプションつけて、バッチコマンド(名前は自由につけてください)で起動します。2行になっているので注意。DOS窓は開きっぱなしです。サービスにしたほうがいいのですが、とりあえずは、これでいきます。起動したら、一度シートをクリックします。 原因不明ですが、一度クリックしないと動きません。
"C:\Program Files (x86)\LibreOffice 5\program\soffice.exe" ^
--calc --norestore --accept=socket,host=localhost,port=8100;urp
マクロと同じことをするのが下記です。libreoffice 付属なので、uno は import
できるはずです。 新規のcalcが開いているのが前提です。 access the current document 以下が、マクロと同じ内容になります。それ以前は、意味がまだ、よくわからない部分ありです。
python スクリプト名(名前は自由にどうぞ) で実行します。
# -*- coding: utf-8 -*-
import uno
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext)
#connect to the running office
ctx = resolver.resolve( "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager
# get the central desktop object
desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)
# access the current document ( calc )
doc = desktop.getCurrentComponent()
sheet = doc.getSheets().getByName('Sheet1')
A1 = sheet.getCellRangeByName('A1')
A1.Value = 999
マクロと外部が同じことができるようになったので、開発はマクロだけよりはましになりました。外部といっても、libreoffice 付属をつかわないといけないので(現時点ではですが)、pip や、ipython が使えず不便です。