Как я могу открыть LibreOffice Calc и закрыть его в режиме без головы - PullRequest
0 голосов
/ 04 января 2019

У меня есть файл .iqy, который является файлом интернет-запросов для Excel. Если я открою этот файл с помощью LibreOffice Calc, я смогу правильно заполнить лист данными и сохранить его как угодно с помощью графического интерфейса.

Мой вопрос заключается в том, как открыть этот файл в автономном режиме, чтобы я мог сохранить заполненный файл как файл .xls? Предпочтительными решениями будут либо скрипты bash, либо Python, потому что я могу легко реализовать их в моем текущем проекте.

Шаги, которые я хочу сделать в режиме без головы, следующие:

  1. Открыть файл .iqy с помощью LibreOffice Calc
  2. Подождите, пока электронная таблица не заполнится данными
  3. Сохранить как .xls

Я могу легко сделать их с помощью GUI, но на сервере, на котором я работаю, я смогу делать это без GUI с помощью сценариев.

РЕДАКТИРОВАТЬ: Кажется, что нет другого способа, чем попытаться сделать это через LibreOffice API. Я выкладываю обновления здесь, если мне удается найти обходной путь.

1 Ответ

0 голосов
/ 08 января 2019

Мне удалось сделать эту работу с python и uno.Ниже мой код

import uno
from com.sun.star.beans import PropertyValue

def convert_iqy_excel(xls_path, socket="socket", host="localhost", port="2002"):
    # get the uno component context from the PyUNO runtime
    localContext = uno.getComponentContext()

    # create the UnoUrlResolver
    resolver = localContext.ServiceManager.createInstanceWithContext(
                            "com.sun.star.bridge.UnoUrlResolver", localContext )

    # connect to the running office
    ctx = resolver.resolve("uno:{},host={},port={};urp;StarOffice.ComponentContext".format(socket,host,port))
    smgr = ctx.ServiceManager

    # get the central desktop object
    desktop = smgr.createInstanceWithContext( "com.sun.star.frame.Desktop",ctx)

    # access the current calc document
    doc = desktop.getCurrentComponent()

    # save as f_name
    f_name = "file://{}".format(xls_path)

    args = (PropertyValue('FilterName', 0, 'MS Excel 97', 0),)

    doc.storeToURL(f_name, args)

    # Do a nasty thing before exiting the python process. In case the
    # last call is a oneway call (e.g. see idl-spec of insertString),
    # it must be forced out of the remote-bridge caches before python
    # exits the process. Otherwise, the oneway call may or may not reach
    # the target object.
    # I do this here by calling a cheap synchronous call (getPropertyValue).
    ctx.ServiceManager
    doc.dispose()

У меня есть LibreOffice 6.0.7.3 и Python 3.6.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...