如何在无头模式下打开和关闭 LibreOffice Calc

How can I open LibreOffice Calc and close it in headless mode

我有 .iqy 文件,它是 Excel 的 Internet 查询文件。如果我使用 LibreOffice Calc 打开该文件,我可以获得 sheet 正确填充的数据,并且我可以使用 GUI 随心所欲地保存它。

我的问题是如何以无头模式打开该文件,以便将填充的文件另存为 .xls 文件?首选解决方案是 bash 脚本或 Python,因为我可以在当前项目中轻松实现它们。

我想在无头模式下执行的步骤如下:

  1. 使用 LibreOffice Calc 打开 .iqy 文件
  2. 等待传播sheet从数据
  3. 填充
  4. 另存为 .xls

我可以使用 GUI 轻松制作它们,但在我工作的服务器上,我应该能够在没有 GUI 的情况下通过脚本来完成这些事情。

编辑:似乎除了尝试通过 LibreOffice API 之外别无他法。如果我设法找到解决方法,我 post 会在这里更新。

我设法用 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