Libre Calc Macro : Python/Basic 相互呼び出し 方法

Libre Calc

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関数テストコード、シートです。
自己責任での御使用をお願いいたします。

タイトルとURLをコピーしました