【问题标题】:LibreOffice 4.1 Writer: macro to adjust column widths in tablesLibreOffice 4.1 Writer:调整表格列宽的宏
【发布时间】:2013-11-05 11:27:21
【问题描述】:

我正在开发一些适用于表格的 LibreOffice 宏,特别是将每列和每行的宽度和高度设置为 0.85 厘米(0.335 英寸)。

在 MS Office 中,这很简单,只需选择表格并在宏中具有:

Selection.Rows.Height = CentimetersToPoints(0.85)
Selection.Columns.PreferredWidth = CentimetersToPoints(0.85)

LibreOffice 4.1 中没有这样的东西。看来每一列/行都必须单独调整。两种方法:

  1. 遍历所有列/行并调整每一列/行

  2. 将第一列/第一行调整为某个仔细计算的宽度/高度,然后调用Distribute Columns/Rows Evenly

为了了解代码,我尝试使用宏记录器并浏览了 Table |表格属性,一直玩到表格看起来没问题,但我所做的大部分内容都没有记录在宏中。

有人做过这样的事吗?

【问题讨论】:

    标签: macros libreoffice word-processor


    【解决方案1】:

    我试图通过使用TableColumnRelativeSum 设置每一行的separators 的位置来计算适当的相对Position,将表格中所有单元格的宽度设置为某个值。有必要使用相对值,因为正如TableColumnSeparator docs 解释的那样:

    表格的实际宽度取决于环境(页面样式和表格位置处的文本列数、对齐方式以及左右边距)。因此,表格列分隔符不包含列宽的度量值。这些值与属性 TextTable::TableColumnRelativeSum 的值相关。

    所以我得到了这段代码,它运行没有错误,而且似乎可以工作。但是,在某些表上(并非所有行都相同的“复杂”表),某些分隔符不会被移动。

    Sub Main
    dim tables as object
    dim table as object
    dim tid as integer
    
    ' Get table
    tables = ThisComponent.TextTables
    table = tables.getByName("Table5")
    
    tableWidthRelative = table.TableColumnRelativeSum
    tableWidthIn = 5.5
    
    columnWidthIn = 0.89
    columnWidthRelative = columnWidthIn / tableWidthIn * tableWidthRelative
    
    ' Get rows
    rows = table.getRows()
    for i = 0 to (rows.Count() - 1)
        row = rows.getByIndex(i)
    
        ' Seps
        seps = row.TableColumnSeparators
    
        ' TableColumnSeparators is a Sequence, which does not support the Count method.  You must use UBound() to get its length.
        numSeps = UBound(seps)
    
        for s = 0 to numSeps
            sep = seps(s)
            sep.Position = columnWidthRelative * (s+1)
            seps(s) = sep
        next
    
        row.TableColumnSeparators = seps
    
        table.Rows(i) = row
    next
    
    end sub
    

    我把它放在这里是因为试图弄清楚它真是一团糟,也许有一天这会对某人有所帮助。

    最后,最好的方法是使用 Bash 脚本通过 xdotool 将键盘输入发送到 LibreOffice。

    在 LibreOffice 网站上的 this question 上有更多详细信息。

    【讨论】:

      【解决方案2】:

      我终于找到了解决这个问题的办法……

      但还是不知道 Position 属性的单位是什么。

      Sub Main
      dim tables as object
      dim table as object
      dim tid as integer
      dim sep()
      
      tables = ThisComponent.TextTables
      
      for tid = 0 to tables.count - 1
          table = tables(tid)
          table.Width = 26000
          sep = table.TableColumnSeparators
          sep(0).Position = 1600
          table.TableColumnSeparators = sep
      next
      
      End Sub
      

      【讨论】:

      • 感谢您的坚持!换算为 1 个单位 = 10 µm = 0.01 mm = 0.001 cm,因此:26000 个单位 = 260 mm = 26 cm 和 1600 个单位 = 16 mm = 1.6 cm
      • 适用于设置第一列的宽度。
      【解决方案3】:

      这是我所能得到的:

      sub Testing
      
          dim tables as object
          dim table as object
          dim columns as object
          dim column as object
          dim index as integer
      
          tables = ThisComponent.TextTables
      
          if tables.Count > 0 then
      
              table = tables.getByIndex(0)
              columns = table.columns
              table.Width = 850 * columns.Count '850 == 0.85 cm
      
              for index = 0 to columns.Count - 1
                  column = columns.getByIndex(index)
                  'column is always NULL
                  'column.Width = 850
              next
      
          end if
      
      end sub
      

      指出的主要问题:

      1. 无法通过ThisComponent.CurrentSelection 检索您要修改的实际表,因此改为硬编码到索引 0 处的表

      2. 对表格的任何更改似乎都没有反映在文档中,也没有明显的方法可以重新渲染或刷新 似乎现在可以工作了!但仍在寻找一种方法来调用函数以均匀分布列

      3. columns.getByIndex 总是返回NULL!,并且没有关于如何在 Basic 中使用列枚举类的文档

      根据这项调查,建议反对尝试使用 LibreOffice 4.1 Writer Basic 宏做任何有成效的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        相关资源
        最近更新 更多