外部プログラムで読んだ FeliCa カードの情報を LibreOffice の Calc に渡してみた。
もし、マクロで FeliCa カードが読めないのなら、この方法でも良いかな・・・と。
(ま、別のエントリーで書く予定だけど、マクロとして実行した Python プログラムで FeliCa カード読めたんだけどね)
1.LibreOffice Calc(表計算)を外部プログラムとの通信可能な状態で起動。
外部プログラムと通信する port 番号を指定して Calc を起動するので、メニュー等からではなく、コマンドで起動すること(Windows ならコマンドプロンプトからとか)C:\Users\shinoda\Source\Python>"C:\Program Files\LibreOffice\program\soffice.exe" --calc --norestore --accept=socket,host=localhost,port=8100;urpこれで、外部プログラムとの通信用 port(8100番)を開けた Calc が起動する。
2.外部プログラムの実行。
今回起動する Python スクリプトはこんな感じ。カードリーダー SONY RC-S380 で読みとった FeliCa カード情報を Calc の任意のセルに貼り付けるだけのプログラム。
import nfcfrom nfc.clf import RemoteTargetimport unolocalContext = uno.getComponentContext()resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext)# Calc に port=8100 で接続ctx = resolver.resolve( "uno:socket,host=localhost,port=8100;urp;StarOffice.ComponentContext" )smgr = ctx.ServiceManager# ドキュメントオブジェクトの取得desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)doc = desktop.getCurrentComponent()sheet = doc.getSheets().getByName('Sheet1')# カード読み込み待ちclf = nfc.ContactlessFrontend('usb')# 'A1' セルにカードリーダー情報をセットcell = sheet.getCellRangeByName('A1')cell.String = str(clf)# カードがタッチされた(情報読み込み)tag = clf.connect(rdwr={'on-connect': lambda tag: False})# 'A2' セルにカード情報をセットcell = sheet.getCellRangeByName('A2')cell.String = str(tag)
これを、コマンドプロンプトから実行(LibreOffice に付いてきたマクロ実行用の Python で実行)する。C:\Users\shinoda\Source\Python>"C:\Program Files\LibreOffice\program\python.exe" .\cellset_to_calc2.py
3.起動と同時に、Calc の 'A1'セルにカードリーダー情報がセットされる
4.カードを読むと、その情報が 'A2'セルにセットされる
ばっちりやね。
デメリットは、コマンドプロンプトから Calc を起動しないといけないことか。
でも、まあ、最悪この方法で LibraOffice にカード情報を渡せることはわかった。人類にとっては大きな一歩だ(笑)
コメントする