如何使用 open office uno API 克隆 TextTable 并将 N 个克隆的 TextTable 粘贴到原始 TextTable 下方

Posted

技术标签:

【中文标题】如何使用 open office uno API 克隆 TextTable 并将 N 个克隆的 TextTable 粘贴到原始 TextTable 下方【英文标题】:How to clone a TextTable and paste N cloned TextTable below the original TextTable using open office uno API 【发布时间】:2021-08-27 03:56:58 【问题描述】:

我有一个 XTextTable 实例。如何 1) 将文本表(内容和格式)克隆到新的 XTextTable 实例中,2) 使用 insertTextContent 方法将新实例插入到文本表下方?

部分代码是这样的

if (element.supportsService("com.sun.star.text.TextTable")):
  table = element
  tableTemplate = doc.createInstance("com.sun.star.text.TextTable")
  #clone properties and content of table to tableTemplate
  #get the position of insertion RANGE
  for datum in data:
     doc.getText().insertTextContent(RANGE,childTable,False)
     #replace placeholder with datum

代码在python中,但我也可以从Java翻译

【问题讨论】:

这些字符串for datum in data:#replace placeholder with datum 让我想到了——你想重复Mail Merge Wizard 正在做什么吗? 是的,这个想法类似于邮件合并。但是,如果该值是一个对象数组,我必须在单独的 textTable 中显示每个数组元素,其中格式/样式由用户在模板 word doc 中定义。 【参考方案1】:

在我看来,您没有选择最简单的方法来解决问题 - 创建一个新对象并克隆它的属性是一个相当费力的过程。如果您需要精确的表格副本,请尝试以下算法:

Sub CloneTable
Dim oTable As Variant       ' Your object
Dim oCurrentController As Variant   ' Controller will copy-paste content
Dim oViewCursor As Variant  ' Cursor will select some points in document
Dim oTransferable As Variant    ' "Clipboard"

    oTable = ThisComponent.getTextTables().getByName("Table1")  ' Get your object as you can
    oCurrentController = ThisComponent.getCurrentController()   ' Create (get) two important tools
    oViewCursor = oCurrentController.getViewCursor()
    oCurrentController.select(oTable)   ' Move your cursor to the beginning of the first cell of your table
    oViewCursor.goLeft(1,False) ' Move the cursor to the left (no selection), position it right before the table
    oViewCursor.goRight(1,True) ' Move the cursor to the right (this time with a selection), select your entire table
    oTransferable = oCurrentController.getTransferable()    ' Get all the information about a selected part of document
    oViewCursor.goRight(0,False)        ' Remove the selection from the table 
Rem (otherwise the first insert will simply overwrite the existing object and you will end up with one less table than expected)
    For i = 1 to 10 ' Repeat the required number of times
        oCurrentController.insertTransferable(oTransferable) ' Paste an exact copy of the object at the current cursor position
    Next i
End Sub

【讨论】:

以上是关于如何使用 open office uno API 克隆 TextTable 并将 N 个克隆的 TextTable 粘贴到原始 TextTable 下方的主要内容,如果未能解决你的问题,请参考以下文章

在最新的 Open Office 安装中未找到 Python Uno

如何知道 Open Office Java API 中的属性值

使用 UI 编辑 MS Office 或 Open Office 文件的 Java API 或库

有啥方法可以将 Open Office 嵌入到我的应用程序中?

如何在 Python + Windows 中使用 LibreOffice API (UNO)?

LibreOffice API/UNO:如何在编写器的表格单元格中水平右对齐文本