Libre CalcでBasic/Pythonを組みわせ機能実現する必要が発生したのですが、相互呼び出す方法がわかなかったので、動きの確認結果を備忘録として書き留めました。
なお、Libre CalcでPython環境を用意する方法は、こちらをご覧いただけると助かります。
■ Basic->Python 呼び出し方法
Basicサブルーチン、関数から、Pythonの関数を呼び出す方法です。
Basicサブルーチン:test_python_caller()より、Python関数:test_basic_callee()を呼び出すサンプルです。
〇 Pythonコードサンプル(Basic関数から呼び出される側)
# coding: utf-8
from __future__ import unicode_literals
import uno
#
# purpose : Basic関数より呼び出される関数
#
def test_basic_callee(arg1):
doc = XSCRIPTCONTEXT.getDocument()
doc.Sheets['test']['C4'].String = arg1 # 引数を確認用シートにセット
result = 'result of ' + arg1
doc.Sheets['test']['D4'].String = result # 戻り値を確認用シートにセット
return(result)
〇 Basicコードサンプル(Python関数を呼び出す側)
コード内の色を付けている部分でPython関数の保存位置、関数名を指定しています。
' ' purpose : Python関数を呼び出す関数 ' public function test_python_caller() Dim script as object Dim arg as String Dim result as string script = ThisComponent.getScriptProvider().getScript("vnd.sun.star.script:test.py$test_basic_callee?language=Python&location=user") arg = "arg1" result = script.invoke(array(arg), array(), array()) # Python関数呼び出し ThisComponent.Sheets.getbyname("test").getCellByPosition(2, 2).String = arg # 引数を確認用シートにセット ThisComponent.Sheets.getbyname("test").getCellByPosition(4, 2).String = result # 戻り値を確認用シートにセット end function
〇 実行結果
Basicコードサンプル:test_python_caller()を実行すると、下記のように結果確認用のシートにBasic側、Python側で合致した引数、戻り値がセットされていることが確認できます。
■ Python->Basic 呼び出し方法
先ほどとは逆に、Python関数からBasic関数を呼び出す方法です。
〇 Basicコードサンプル(Python関数から呼び出される側)
'
' purpose : Python関数から呼び出される関数
'
public function test_python_callee(arg1 as string) as string
ThisComponent.Sheets.getbyname("test").getCellByPosition(2, 8).String = arg1
test_python_callee = "result of " & arg1
ThisComponent.Sheets.getbyname("test").getCellByPosition(3, 8).String = test_python_callee
end function
〇 Pythonコードサンプル(Basic関数を呼び出す側)
コード内の色を付けている部分でBasic関数の保存位置、関数名を指定しています。
# coding: utf-8
from __future__ import unicode_literals
import uno
#
# purpose : Basic関数を呼び出す関数
#
def test_basic_caller():
doc = XSCRIPTCONTEXT.getDocument()
sp = doc.getScriptProvider()
macro = 'vnd.sun.star.script:Standard.test.test_python_callee?language=Basic&location=document'
arg1 = 'arg1'
script = sp.getScript(macro)
result = script.invoke((arg1,),(),())
doc.Sheets['test']['C8'].String = arg1
doc.Sheets['test']['E8'].String = result[0]
〇 実行結果
Pythonコードサンプル:test_basic_caller()を実行すると、下記のように結果確認用のシートにBasic側、Python側で合致した引数、戻り値がセットされていることが確認できます。
■ サンプルプログラム
上記Basic/Python関数テストコード、シートです。
自己責任での御使用をお願いいたします。