如何合并单元而不丢失libreoffice-calc中的数据?

问题描述

启动libreoffice-calc:

soffice --calc --accept="socket,host=localhost,port=2002;urp;STaroffice.ServiceManager" 

启动python shell,将数据写入calc

import uno
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver",localContext)
context = resolver.resolve("uno:socket,port=2002;urp;STaroffice.ComponentContext")
svcmgr = context.ServiceManager
desktop = svcmgr.createInstanceWithContext("com.sun.star.frame.Desktop",context)
odoc = desktop.loadComponentFromURL( "private:factory/scalc","_blank",() )
oSheet = odoc.getSheets().getByIndex(0)
oRange = oSheet.getCellRangeByName("A1:C3")

将数据写入oRange

oRange.setDataArray((('a1','a2','a3'),('b1','b2','b3'),('c1','c2','c3'),))

现在计算的外观:

enter image description here

我想合并oRange中的所有数据,并以垂直和水平对齐方式对其进行格式化。
我在编辑calc时需要的效果

enter image description here

oRange.merge()
oCell = oSheet.getCellByPosition(0,0)
oCell.HoriJustify = 2
oCell.VertJustify = 2

具有垂直和水平对齐方式的合并数据,许多单元格b1-c1a2-c2a3-c3中的先前数据丢失。
真正的效果

enter image description here

如何修复我的代码以获得所需的效果

解决方法

import uno
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver",localContext)
context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext")
svcmgr = context.ServiceManager
desktop = svcmgr.createInstanceWithContext("com.sun.star.frame.Desktop",context)
oDoc = desktop.loadComponentFromURL( "private:factory/scalc","_blank",() )
oSheet = oDoc.getSheets().getByIndex(0)
oRange = oSheet.getCellRangeByName("A1:C3")
tup = (('a1','a2','a3'),('b1','b2','b3'),('c1','c2','c3'),)
oRange.setDataArray(tup)
target =''
for item in tup:
    tmp = ' '.join(item)
    target = target + tmp + ' '

target = target.strip()
oRange.merge(True)
oCell = oSheet.getCellByPosition(0,0)
oCell.String = target
oCell.HoriJustify = 2
oCell.VertJustify = 2
,

我不确定,但是我认为UNO无法知道您想以这种方式将数据重新排列到合并的单元格中。 UNO要做的是“复制”来自“主”单元(左上角的单元)的数据,并将其数据“粘贴”到合并的单元中。因此,您可以做的是在合并之前更改主单元的数据。请查看下面的示例。

# get range
oRange = oSheet.getCellRangeByName("A1:C3")

# build string
flat_list = [str(item) for sublist in oRange.getDataArray() for item in sublist]
string = ' '.join(flat_list)

# put string into main cell
main_cell = oRange.getCellByPosition(0,0) 
main_cell.setString(string)

# merge
oRange.merge()