Как объединить ячейки без потери данных в libreoffice-calc?

Запустите libreoffice-calc:

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

Запустите оболочку Python для записи данных в calc:

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", 0, () )
oSheet = oDoc.getSheets().getByIndex(0)
oRange = oSheet.getCellRangeByName("A1:C3")

Запишите данные в oRange.

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

Внешний вид накипи сейчас:

введите здесь описание изображения

Я хочу объединить все данные в oRange и отформатировать их с выравниванием по вертикали и горизонтали.
Мой желаемый эффект при редактировании calc.
введите здесь описание изображения

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

Объединены данные с вертикальным и горизонтальным выравниванием, предыдущие данные во многих ячейках b1-c1 и a2-c2 и a3-c3 потеряны.
Реальный эффект. введите здесь описание изображения

Как исправить мой код, чтобы получить желаемый эффект?


person showkey    schedule 31.08.2020    source источник


Ответы (1)


Я не уверен, но я думаю, что 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()
person Carlos Galdino    schedule 08.11.2020