Как написать макрос Python в libreoffice calc для отправки и получения данных

Предпосылка: я работаю в libreoffice calc и мне нужно отправить инструкцию другой программе, которая, как я знаю, прослушивает порт TCP через макрос. Я ожидаю ответа от прослушивающей программы и хочу вставить данные ответа в электронную таблицу libreoffice.

1 ответ

Решение

Мне много раз помогал поиск в stackru, я думал, что опубликую решение проблемы, решение которой потребовало много усилий. Код разбивает данные на строки и вставляет их в ячейку, в которой в данный момент находится курсор, и для каждой строки последующих данных увеличивает строку для следующей вставки.

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
Другие вопросы по тегам