リブレオフィス 5.2.3.3
Excel VBScript プログラムを PyUno に移植しようとしています。ロジックは機能しますが、実行速度は Excel よりもはるかに遅くなります。
Sheet1とSheet2の2枚を作りました。以下のスクリプトを参照して、呼び出すボタンを Sheet1 に追加し、呼び出すボタンをcreate
Sheet2に追加しましたcopy
。create
実行して完了するのを待った後、実行しますcopy
。
さらに最適化する方法はありますcopy
か? 別のスレッドで実行すると、各行がいっぱいになるのがわかりますが、人間の目には瞬時であることを願っていました。スレッドを削除すると、グラフィックが更新されるのを待つだけです。
(私の元のコードは、目に見えない CSV ファイルからデータをコピーしますが、これには何らかの理由でさらに時間がかかり、個別のスレッドなしで Calc がロックされるまでになります。これで問題が明らかになると思っていましたが、どうやら別のテスト ケースが必要なようです。または、それらのセルにテキストが多いことが重要かもしれません。)
編集 1: @Jim K のコメントへの応答: 「別のスレッド」は、次のように、追加の関数がビジネス ロジックのスレッドを生成することを意味します。
import threading
def _create():
# ...
pass
def create(clickEvent):
t = threading.Thread(target=_create)
t.start()
g_exportedScripts = create,
test.py (これが問題のコードです。)
import msgbox
import os
import uno
def copyFormula(a, b):
formula = a.getFormula()
b.setFormula(formula)
return formula != ''
doc = XSCRIPTCONTEXT.getDocument()
def copy(clickEvent):
sheet1 = doc.Sheets.getByName('Sheet1')
sheet2 = doc.Sheets.getByName('Sheet2')
for y in range(0, 5):
for x in range(0, 150):
source = sheet1.getCellByPosition(x, y)
target = sheet2.getCellByPosition(x, y)
copyFormula(source, target)
def create(clickEvent):
sheet1 = doc.Sheets.getByName('Sheet1')
sheet2 = doc.Sheets.getByName('Sheet2')
for y in range(0, 5):
for x in range(0, 150):
target = sheet1.getCellByPosition(x, y)
target.setFormula('({}, {})'.format(x, y))
g_exportedScripts = create, copy