首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PyUno中优化公式复制

在PyUno中优化公式复制
EN

Stack Overflow用户
提问于 2016-12-20 22:35:40
回答 1查看 461关注 0票数 0

LibreOffice 5.2.3.3

我正在尝试将一个Excel VBScript程序移植到PyUno。逻辑可以工作,但运行速度要比在Excel中慢得多。

我做了两张床单,Sheet1和Sheet2。在引用下面的脚本时,我向Sheet1添加了一个按钮以调用create,向Sheet2添加了一个按钮以调用copy。在运行create并等待它完成之后,我运行copy

copy**?**在一个单独的线程中运行时,我可以看到每一行都被填满了,而我希望这将是即时的,有任何方法来进一步优化它。删除线程只会使图形等待更新。

(我的原始代码从一个不可见的CSV文件中复制数据,由于某种原因,这个文件所用的时间甚至更长,以至于它不需要单独的线程就可以锁定Calc。我以为这会证明这个问题,但显然我需要另一个测试用例。或者重要的是这些单元格有更多的文本。)

编辑1:回应@Jim的评论:“单独线程”意味着额外的函数为业务逻辑生成一个线程,如下所示:

代码语言:javascript
复制
import threading


def _create():
    # ...
    pass


def create(clickEvent):
    t = threading.Thread(target=_create)
    t.start()


g_exportedScripts = create,

test.py (这是正在讨论的代码)。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 01:01:06

这些功能中的任何一个都应该更快:

代码语言:javascript
复制
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)

或者,使用dispatcher复制剪贴板并粘贴。

有关复制和粘贴单元格的更多信息,请参见安德鲁·皮托尼亚克的宏观文件中的5.23节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41252310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档