如何在 libreoffice calc 中编写 python 宏来发送和接收数据

Posted

技术标签:

【中文标题】如何在 libreoffice calc 中编写 python 宏来发送和接收数据【英文标题】:How do I write a python macro in libreoffice calc to send and receive data 【发布时间】:2015-03-06 13:21:48 【问题描述】:

前提:我在 libreoffice calc 中工作,需要通过宏向我知道正在侦听 TCP 端口的另一个程序发送指令。 我期待监听程序的回复,并希望将回复数据插入到 libreoffice 电子表格中。

【问题讨论】:

这是个问题吗?如果您有答案,您可以回答您自己的问题 顺便说一句,你已经发布了这个twice。其中一个可以作为重复关闭。 我使用此网站查看是否有其他人对我遇到的问题提出了答案。我认为发布此类问题的解决方案就可以了。如果我违反了本网站的某些规则或其他规则,那么如果您能指出正确的方向,我会很乐意撤回我的帖子。有两个类似的帖子,一个是针对 libreoffice writer,另一个是针对 libreoffice calc,它们使用的技术略有不同,这是 UNO api 的漏洞之一。让我知道是否应该删除这些帖子,因为我还有 3 或 4 个帖子要删除。 你没有违反规则。为了帮助减少回答问题的人的流量,我建议将“(自我回答)”放在最后。那么问题和答案一般被审稿人视为一个单元。在这一点上可能不值得做,但值得在未来尝试。 【参考方案1】:

通过搜索 *** 多次得到帮助,我想我会发布一个解决方案来解决一个需要付出很多努力才能解决的问题。 代码将数据分成几行并插入到光标当前所在的单元格中,并且对于后续数据的每一行,都会为下一次插入增加该行。

Configobj 是一个从平面文件中读取参数的包。在此示例中,我使用该文件来存储要使用的 TCP 端口。监听程序和这段代码都从同一个配置文件中读取端口号。它可能是硬编码的。

这是一个适用于我的 python 宏,我相信它会为其他人指明正确的方向。

def fs2ClientdataCalc(*args):

    desktop = XSCRIPTCONTEXT.getDesktop()
    model = desktop.getCurrentComponent()
    try:
        sheets = model.getSheets()
    except AttributeError:
        raise Exception("This script is for Calc Spreadsheets only")
    #sheet = sheets.getByName('Sheet1')
    sheet = model.CurrentController.getActiveSheet()
    oSelection = model.getCurrentSelection()
    oArea = oSelection.getRangeAddress()
    first_row = oArea.StartRow
    last_row = oArea.EndRow
    first_col = oArea.StartColumn
    last_col = oArea.EndColumn
    #get the string from Footswitch2 via a TCP port
    import os, socket, time
    from configobj import ConfigObj
    configuration_dir = os.environ["HOME"]
    config_filename = configuration_dir + "/fs2.cfg"
    if  os.access(config_filename, os.R_OK):
        pass
    else:
        return None
    cfg = ConfigObj(config_filename)
    #define values to use from the configuration file
    tcp_port = int(cfg["control"]["TCP_PORT"])
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(0.5)
    try:
        sock.connect(("localhost", tcp_port))
    except:
        return None
    sock.settimeout(10)
    try:
        sock.send(bytes('client\n', 'UTF-8'))
    except:
        return None
    try:
        time.sleep(1.0)
        s_list = sock.recv(4096).decode('UTF-8')
        s_list = s_list.split("\n")
    except:
        return None
    lines_in_response = len(s_list)
    if lines_in_response is None:
        return None
    column =['A','B','C','D','E','F','G','H','I','J','K','L','M',\
             'N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    for x in range(0,lines_in_response):
        insert_table = s_list[x].split("\n")
        parts = len(insert_table)
        for y in range(0,parts):
            it = insert_table[y]
            cell_name = column[first_col + y]+str(x +1 +first_row)
            cell = sheet.getCellRangeByName(cell_name)
            cell.String = it

    sock.close()
    return None

【讨论】:

非常有用的例子,罗尔夫。请问,你是怎么知道socket库可用的? import socket @JannieT 时间的迷雾!我正在使用 unix 套接字将击键发送到 vlc 的“假 tty”界面,基于踏板上的哪个踏板,但那是很久以前的事了,在我发现evdev 哈哈哈。我的问题不是很清楚,但发现这也很有帮助***.com/questions/3952513/get-available-modules 继续发布好东西! @JannieT 确实,我误解了这个问题。因为socket 是一个标准库,所以我没有想到。如在您提供的链接中,如果有人阅读您的问题并且链接消失:在 python 命令行上,输入help(),然后输入modules,它提供了所有可用模块的列表。如果您使用像 wx 这样的大模块,它特别有用,其中 modules wx 提供所有可用的子模块,即列出带有关键字 wx 的模块

以上是关于如何在 libreoffice calc 中编写 python 宏来发送和接收数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LibreOffice Calc 中使用 PyUNO 更改单元格边框的 LineWidth?

运行程序并返回值 libreoffice calc

在 Basic 中计算自己的对数(LibreOffice Calc Macro)

如何将数据从 LibreOffice Calc 导入 SQL 数据库?

libreoffice calc - 宏中的可变参数

在 Python 中定义一个 LibreOffice Calc 自定义函数