优化 PyUno 中的公式复制
Optimizing formula copying in PyUno
LibreOffice 5.2.3.3
我正在尝试将 Excel VBScript 程序移植到 PyUno。逻辑有效,但 运行 比 Excel.
慢得多
我制作了两张纸,Sheet1 和 Sheet2。参考下面的脚本,我在 Sheet1 中添加了一个按钮来调用 create
,在 Sheet2 中添加了一个按钮来调用 copy
。在 运行ning create
并等待它完成后,我 运行 copy
.
有没有办法进一步优化copy
?当它运行在一个单独的线程中时,我可以看到每一行都被填充了,而我希望它对人眼来说是瞬间的。删除线程只会让图形等待更新。
(我的原始代码从一个不可见的 CSV 文件中复制数据,由于某种原因,这需要更长的时间,以至于它在没有单独线程的情况下锁定了 Calc。我认为这会证明这个问题,但显然我需要另一个测试用例。或者这些单元格有更多文本可能很重要。)
编辑 1: 回应@Jim K 的评论:"Separate thread" 表示附加函数为业务逻辑生成一个线程,如下所示:
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
这些函数中的任何一个都应该快得多:
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)
或者,使用调度程序通过剪贴板进行复制和粘贴。
有关复制和粘贴单元格的详细信息,请参阅 Andrew Pitonyak's macro document 中的第 5.23 节。
LibreOffice 5.2.3.3
我正在尝试将 Excel VBScript 程序移植到 PyUno。逻辑有效,但 运行 比 Excel.
慢得多我制作了两张纸,Sheet1 和 Sheet2。参考下面的脚本,我在 Sheet1 中添加了一个按钮来调用 create
,在 Sheet2 中添加了一个按钮来调用 copy
。在 运行ning create
并等待它完成后,我 运行 copy
.
有没有办法进一步优化copy
?当它运行在一个单独的线程中时,我可以看到每一行都被填充了,而我希望它对人眼来说是瞬间的。删除线程只会让图形等待更新。
(我的原始代码从一个不可见的 CSV 文件中复制数据,由于某种原因,这需要更长的时间,以至于它在没有单独线程的情况下锁定了 Calc。我认为这会证明这个问题,但显然我需要另一个测试用例。或者这些单元格有更多文本可能很重要。)
编辑 1: 回应@Jim K 的评论:"Separate thread" 表示附加函数为业务逻辑生成一个线程,如下所示:
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
这些函数中的任何一个都应该快得多:
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)
或者,使用调度程序通过剪贴板进行复制和粘贴。
有关复制和粘贴单元格的详细信息,请参阅 Andrew Pitonyak's macro document 中的第 5.23 节。