2016-12-20 5 views
0

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 
+0

Действительно ли LibreOffice пытается перерисовать GUI? Мне интересно, может ли быть что-то похожее на «замораживание» и «оттаивание» в wxpython, где вы говорите графическому интерфейсу «прекратите рисовать, пока я не скажу вам это». – alex314159

+1

Я запустил этот код на быстрой машине, и каждая функция заняла менее одной секунды. На медленной машине (около 11 лет) потребовалось около 4 секунд. Это то, что вы нашли, или оно работает намного медленнее на вашей машине? Также я не понимал, что вы имели в виду, работая в отдельном потоке. Означает ли это что-то отличное от простого нажатия кнопки на каждом листе? Примечание. Если LibreOffice открывается в [режиме прослушивания] (https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Starting_OpenOffice.org_in_Listening_Mode), он будет работать намного медленнее. –

+1

@ alex314159: да, есть 'doc.lockControllers()' и 'doc.unlockControllers()' [https://www.openoffice.org/api/docs/common/ref/com/sun/star/frame/ XModel.html] – ngulam

ответ

1

Каждая из этих функций должны быть гораздо быстрее:

def copy2(clickEvent=None): 
    sheet1 = doc.Sheets.getByName('Sheet1') 
    sheet2 = doc.Sheets.getByName('Sheet2') 
    range1 = sheet1.getCellRangeByPosition(0,0,150,5) 
    range2 = sheet2.getCellRangeByPosition(0,0,150,5) 
    range2.setDataArray(range1.getDataArray()) 

def copy3(clickEvent=None): 
    sheet1 = doc.Sheets.getByName('Sheet1') 
    sheet2 = doc.Sheets.getByName('Sheet2') 
    range1 = sheet1.getCellRangeByPosition(0,0,150,5).RangeAddress 
    range2 = sheet2.getCellRangeByPosition(0,0,150,5).RangeAddress 
    cell2 = sheet2.getCellByPosition(
     range2.StartColumn, range2.StartRow).CellAddress 
    sheet1.copyRange(cell2, range1) 

В качестве альтернативы, используйте диспетчер, чтобы скопировать и вставить в буфер обмена.

Дополнительную информацию о копировании и вклеивании ячеек см. В разделе 5.23 в Andrew Pitonyak's macro document.

+0

Спасибо, я посмотрю на это завтра. Кроме того, я не думаю, что моя ссылка на вас работала, поэтому см. Мое редактирование на вопрос. – Grault

 Смежные вопросы

  • Нет связанных вопросов^_^