0

リブレオフィス 5.2.3.3

Excel VBScript プログラムを PyUno に移植しようとしています。ロジックは機能しますが、実行速度は Excel よりもはるかに遅くなります。

Sheet1とSheet2の2枚を作りました。以下のスクリプトを参照して、呼び出すボタンを Sheet1 に追加し、呼び出すボタンをcreateSheet2に追加しましたcopycreate実行して完了するのを待った後、実行します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
4

1 に答える 1