使用 Python3 在 LibreOffice Calc 中更改行高和列宽

Changing row-height and column-width in LibreOffice Calc using Python3

我想在 Python3 程序中编写 LibreOffice Calc 文档。使用 pyoo 我几乎可以做任何我想做的事情,包括格式化和合并单元格。但是我无法调整行高和列宽。

我发现 非常有用,并且一直在试验它,但我似乎无法获得我想要的结果。根据上面提到的答案,我目前的测试文件如下所示:

#! /usr/bin/python3

import os, pyoo, time, uno

s = '-'
while s != 'Y':
    s = input("Have you remembered to start Calc? ").upper()

os.popen("soffice --accept=\"socket,host=localhost,port=2002;urp;\" --norestore --nologo --nodefault")
time.sleep(2)
desktop = pyoo.Desktop('localhost', 2002)
doc = desktop.create_spreadsheet()

class ofic:
    sheet_idx = 0
    row_num = 0
    sheet = None

o = ofic()

uno_localContext = uno.getComponentContext()
uno_resolver = uno_localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", uno_localContext )
uno_ctx = uno_resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
uno_smgr = uno_ctx.ServiceManager
uno_desktop = uno_smgr.createInstanceWithContext( "com.sun.star.frame.Desktop", uno_ctx)
uno_model = uno_desktop.getCurrentComponent()
uno_controller = uno_model.getCurrentController()
uno_sheet_count = 0

doc.sheets.create("Page {}".format(1), index=o.sheet_idx)
o.sheet = doc.sheets[o.sheet_idx]
o.sheet[0, 0].value = "The quick brown fox jumps over the lazy dog"
o.sheet[1, 1].value = o.sheet_idx

uno_controller.setActiveSheet(uno_model.Sheets.getByIndex(uno_sheet_count))
uno_sheet_count += 1
uno_active_sheet = uno_model.CurrentController.ActiveSheet
uno_columns = uno_active_sheet.getColumns()
uno_column = uno_columns.getByName("B")
uno_column.Width = 1000

上面的主要问题是我在屏幕上有 2 个 Calc 文档,其中一个是在 Python 程序运行之前创建的;另一个是使用 pyoo 函数从 Python 创建的。第一个文档更改了列宽,第二个文档接收文本输入等。我只想要第二个文档,当然我想要应用列宽更改。

我相信答案一定很简单,但经过几个小时的试验我还是找不到。有人能给我指出正确的方向吗?

您的代码在 pyoo 和直接 Python-UNO 之间交替,所以它给出混乱的结果也就不足为奇了。选择一个或另一个。就个人而言,我直接使用 Python-UNO,看不到添加额外的 pyoo 库的好处。

the other is created from Python with a pyoo function

您的意思是您问题中的这行代码,这是您要应用列更改的“第二个文档”吗?

doc = desktop.create_spreadsheet()

如果是,则从该文档中获取对象,而不是 window 桌面恰好选择的对象。

controller = doc.getCurrentController()
sheets = doc.getSheets()

或者您可能想要其他文档,不是从 Python 创建的文档。在这种情况下,在创建第二个文档之前获取对该文档的引用。

first_doc = uno_desktop.getCurrentComponent()
second_doc = desktop.create_spreadsheet()
controller = first_doc.getCurrentController()
sheets = first_doc.getSheets()

如果您没有对文档的引用,可以通过遍历打开 windows.

来找到它
oComponents = desktop.getComponents()
oDocs = oComponents.createEnumeration()

最后,如何调整列的大小。您问题中的 link 适用于 Excel 和 VBA(均来自 Microsoft),因此我不确定您为什么认为这相关。这是调整列大小的 Python-UNO 示例。

oColumns = oSheet.getColumns()
oColumn = oColumns.getByName("A")
oColumn.Width = 7000
oColumn = oColumns.getByName("B")
oColumn.OptimalWidth = True