【问题标题】:How to merge cells without losting data in libreoffice-calc?如何合并单元格而不丢失 libreoffice-calc 中的数据?
【发布时间】:2020-08-31 01:12:54
【问题描述】:

启动 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,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-c1a2-c2a3-c3 丢失。
真实的效果。

如何修复我的代码以获得预期的效果?

【问题讨论】:

    标签: python-3.x merge libreoffice-calc uno


    【解决方案1】:
    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")
    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
    

    【讨论】:

      【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2013-09-18
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多