【问题标题】:Python Script in LibreOffice Calc doesn't refresh automatically it's variablesLibreOffice Calc 中的 Python 脚本不会自动刷新它的变量
【发布时间】:2022-02-16 21:27:40
【问题描述】:

我需要知道表格中最后一行的编号才能处理它。所以,我用 Python 写了这个函数:

def find_last_cell(cursor):
    cursor.gotoEnd()
    last_cell = sheetCalc.getCellRangeByName(cursorCalc.AbsoluteName)
    last_column = last_cell.CellAddress.Column
    last_row = last_cell.CellAddress.Row

    return last_column, last_row

我在我的“主要”函数中写了这个:

def calcula(oEvent):

    column_1, row_1 = find_last_cell(cursorCalc)
    write_Value(column_1, sheetCalc, 2, 28) #Just for debug
    write_Value(row_1, sheetCalc, 2, 29) #Just for debug

    #fill_qtd(row_1)
    #fill_tension(row_1)
    #fill_fp(row_1)


    return 0

问题:

第一次使用效果很好:

但是,当我修改表格并按下按钮时,它保持相同的结果:

调试:

  • 如果我转到文件>>刷新,当我再次按下按钮时会出现此错误:

com.sun.star.uno.RuntimeException:(在模块文件中调用函数计算时出错:///C:/Users/34471945882/AppData/Roaming/LibreOffice/4/user/Scripts/python/Calc_Inst.py (: 文件“C:\Program Files\LibreOffice\program\pythonscript.py”,第 915 行,在调用中 ret = self.func( *args ) 文件“C:\Users\34471945882\AppData\Roaming\LibreOffice\4\user\Scripts\python\Calc_Inst.py”,第 154 行,在 calcula column_1, row_1 = find_last_cell(cursorCalc) #Verifica a última célula ocupada 文件“C:\Users\34471945882\AppData\Roaming\LibreOffice\4\user\Scripts\python\Calc_Inst.py”,第 95 行,在 find_last_cell last_cell = sheetCalc.getCellRangeByName(cursorCalc.AbsoluteName) #Seleciona a última célula ))

  • 如果我在我的 python 文件中进行任何修改(例如添加注释)并再次保存,它就可以工作。但是我需要对表中的每个修改都执行此操作,这对用户来说是不寻常的。

问题:如何纠正这种行为?我想随时使用按钮而不需要刷新或修改python文件?

LibreOffice 版本: 版本:7.2.5.2 (x64) / LibreOffice 社区 内部版本号:499f9727c189e6ef3471021d6132d4c694f357e5 CPU线程:4;操作系统:Windows 6.3 Build 9600; UI 渲染:Skia/Raster; VCL:赢 区域设置:pt-BR (pt_BR);用户界面:pt-BR 计算:CL

【问题讨论】:

  • cursorCalc.AbsoluteName - 你是说cursor.AbsoluteName吗?另外,cursorCalc 是在哪里定义的?如果它是一个全局变量,那么这很可能是问题所在。
  • @JimK,是的,这一切都在我的 python 文件的开头定义:sheets = document.getSheets(); sheetCalc = sheet.getByName('Calculadora'); cursorCalc = sheetCalc.createCursor()。这是一个全局变量。但为什么会出现问题?
  • 对,所以如果它是全局的,那么它不会得到改变的值。而是在 calcula() 的开头初始化这些值,并去掉所有的全局变量。它们不是必需的。正如您已经发现的那样,当 python 文件被修改时,代码的初始部分只运行一次。这是声明常量而非变量的好地方。
  • 谢谢@JimK,它正在工作!

标签: python libreoffice libreoffice-calc


【解决方案1】:

编程中的全局变量通常是个坏主意,这也不例外。来自评论:

如果它是全局的,那么它不会得到改变的值。而是在calcula() 的开头初始化这些值...代码的初始部分仅在修改 python 文件时运行一次,正如您已经发现的那样。这是声明常量而非变量的好地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多