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

How to change a cell value periodically in libreoffice calc?

标题说明了一切...

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

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

编辑: 按照@Jim K 提供的答案,我想更清楚地了解我想要什么。上面的 "clock" 示例是为了使它更容易理解,但我真正想要的是标题: 一个周期性变化的单元格值,可以是字符串,数字,日期。 ..

tl;博士

Is there a simple function implemented already

没有

来自 LibreOffice 并且相当近期:

(I don't know a 'clock' property applying to cells.)

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

=NOW()

Ctrl+;

或者,例如,没有日期:

=MOD(NOW(),1)

第一个和最后一个将更新,但只有在 sheet 重新计算时才会更新。

对于滴答作响的单元格(例如一秒一秒),我相信您需要一个脚本。

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

接下来,这个 Basic 宏(来自 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)