LibreOffice 5.2.3.3Оптимизация копирования формул в PyUno
Я пытаюсь перенести программу Excel VBScript в PyUno. Логика работает, но она работает намного медленнее, чем в Excel.
Я сделал два листа, Sheet1 и Sheet2. Ссылаясь на приведенный ниже сценарий, я добавил кнопку Sheet1 для вызова create
и один для Sheet2 для вызова copy
. После запуска create
и ожидая его завершения, я запустил copy
.
Есть ли способ дальнейшей оптимизации copy
? Когда он работает в отдельном потоке, я вижу, что каждая строка заполняется, и я надеялся, что это мгновенно станет для человеческого глаза. Удаление потока просто заставляет графику ждать обновления.
(Мой оригинальный код копирует данные из невидимого CSV-файла, который по какой-то причине занимает больше времени, до такой степени, что он блокирует Calc без отдельных потоков. Я думал, что это будет проявлять эту проблему, но, по-видимому, мне нужно . другой тест а может быть, это важно, что эти клетки имеют больше текста)
Edit 1:. В ответ на комментарий @Jim Д.К.: «Отдельный поток» означает, что дополнительная функция порождает поток для бизнес-логики, как так:
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
Действительно ли LibreOffice пытается перерисовать GUI? Мне интересно, может ли быть что-то похожее на «замораживание» и «оттаивание» в wxpython, где вы говорите графическому интерфейсу «прекратите рисовать, пока я не скажу вам это». – alex314159
Я запустил этот код на быстрой машине, и каждая функция заняла менее одной секунды. На медленной машине (около 11 лет) потребовалось около 4 секунд. Это то, что вы нашли, или оно работает намного медленнее на вашей машине? Также я не понимал, что вы имели в виду, работая в отдельном потоке. Означает ли это что-то отличное от простого нажатия кнопки на каждом листе? Примечание. Если LibreOffice открывается в [режиме прослушивания] (https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Starting_OpenOffice.org_in_Listening_Mode), он будет работать намного медленнее. –
@ alex314159: да, есть 'doc.lockControllers()' и 'doc.unlockControllers()' [https://www.openoffice.org/api/docs/common/ref/com/sun/star/frame/ XModel.html] – ngulam