如何在 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)
标题说明了一切...
例如,如果我想要一个显示当前时间并按分钟自动更新的单元格(嗯,我想我们称之为时钟),我该怎么做?
是否已经实现了一个简单的功能,或者我应该创建一个宏并将其分配给特定事件?
编辑: 按照@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)