【问题标题】:How to change a cell value periodically in libreoffice calc?如何在 libreoffice calc 中定期更改单元格值?
【发布时间】:2017-07-10 13:32:44
【问题描述】:

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

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

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

编辑:按照@Jim K 提供的答案,我想更清楚我想要什么。上面的“时钟”示例是为了便于理解,但我真正想要的是标题:周期性变化的单元格值,可以是字符串、数字、日期......强>

【问题讨论】:

  • 好吧,如果可能的话,是的!作为一个整体,如果单元格值为“=NOW()”并且我不想要,则重新计算将更新日期和时间。理想情况下,这些单元格应该保持它们的设置。
  • 没错。我想及时更改特定的单元格值(无论是数字、字符串还是它具有的任何值),而不会干扰文档的其余部分。你有什么想法吗?

标签: macros libreoffice-calc


【解决方案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)

【讨论】:

  • 感谢您的贡献。但是我采用了“时钟”示例以使其易于理解它应该做什么,但是使用您的代码它会更新所有单元格,如果里面有一个“=NOW()”公式,单元格值会发生变化......所以我不能有超过 1 个包含该公式的单元格!我正在寻找的是一种定期更改特定单元格值的方法。更新我的 OP。
  • 我正在尝试使您编辑的版本正常工作,但我以前从未使用过 python,而且我不知道如何将脚本包含在我的 calc 文档中,尽管我遵循了这个tutorial。我的文档中没有嵌入脚本。有什么帮助吗?
  • 让我们在chat room 中讨论这个问题。
  • 问题已解决(没有为 LibreOffice 正确安装 python)!谢谢@Jim K
【解决方案2】:

tl;博士

是否已经实现了一个简单的功能

没有。

来自LibreOffice 并且是最近的:

(我不知道应用于单元格的“时钟”属性。)

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

=NOW()

Ctrl+;

或者,例如,没有日期:

=MOD(NOW(),1)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多