如何在libreoffice calc中定期更改单元格值?

时间:2017-07-07 22:47:03

标签: macros libreoffice-calc

标题说明了一切......

例如,如果我想要一个显示当前时间的单元格并逐分钟自动更新(好吧,我想我们称之为时钟),我该怎么做?

是否已经实现了一个简单的功能,或者我应该创建一个宏并将其分配给特定事件?

编辑:按照@Jim K提供的答案,我想更清楚自己想要什么。上面的“时钟”示例是为了使其易于理解,但我真正想要的是标题:一个周期性变化的单元格值,无论是字符串,数字,日期......

2 个答案:

答案 0 :(得分:1)

首先在单元格中输入=NOW(),然后转到格式 - >格式化数字。细胞

接下来,此基本宏(来自here)每分钟重新计算一次。转到工具 - >自定义并将其分配给Open Document事件。

Sub RecalculatePeriodically
   Const secs = 60
   On Error Goto ErrorHandler
   Do While True
      Wait(1000 * secs)
      ThisComponent.calculateAll()
   Loop
   ErrorHandler:
       'Document was probably closed
End Sub

但是,退出LibreOffice时会崩溃。因此,请使用以下线程Python宏(如here)。将keep_recalculating_thread分配给Open Document活动。

import time
from threading import Thread
import uno

def keep_recalculating_thread(action_event=None):
    t = Thread(target = keep_recalculating)
    t.start()

def keep_recalculating():
    oDoc = XSCRIPTCONTEXT.getDocument()
    while hasattr(oDoc, 'calculateAll'):
        oDoc.calculateAll()
        time.sleep(60)

g_exportedScripts = keep_recalculating_thread,

另一个想法是在https://ask.libreoffice.org/en/question/5327/how-can-i-run-a-macro-at-regular-time-interval/,虽然它需要链接到另一个看起来很麻烦的文件。

修改

也许你正在寻找这样的东西?通过从空白电子表格开始并在单元格A1中输入1来测试它。

def keep_changing_cell(action_event=None):
    t = Thread(target = keep_changing_thread)
    t.start()

def keep_changing_thread():
    oDoc = XSCRIPTCONTEXT.getDocument()
    oSheet = oDoc.CurrentController.ActiveSheet
    COLUMN_A = 0
    FIRST_ROW = 0
    oCell = oSheet.getCellByPosition(COLUMN_A, FIRST_ROW)
    while hasattr(oDoc, 'calculateAll'):
        oCell.setValue(oCell.getValue() + 1)
        time.sleep(2)

答案 1 :(得分:0)

TL;博士

  

是否已实施简单功能

没有

来自LibreOffice并且最近:

  

(我不知道应用于细胞的时钟属性。)

有一些简单的方法可以获得时间,例如给定合适的格式,日期:

=NOW()

Ctrl + ;

或者,例如,没有日期:

=MOD(NOW(),1)

第一个和最后一个将更新,但仅在重新计算工作表时才会更新。

对于一个剔除的单元格(例如秒钟)我相信你需要一个脚本。