LibreOffice 4.1 Writer:宏来调整表格中的列宽

时间:2013-10-26 09:46:21

标签: macros libreoffice word-processor

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

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

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

LibreOffice 4.1中没有这样的东西。似乎每个列/行必须单独调整。有两种方法可以做到这一点:

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

  2. 将第一列/行调整为精心计算的宽幅/高度,然后调用均匀分布列/行

  3. 为了了解代码,我尝试使用宏录制器并通过Table |表格属性并且在桌子看起来没问题之前玩了,但我做的大部分内容都没有记录在宏中。

    有人做过这样的事吗?

3 个答案:

答案 0 :(得分:4)

这是我能得到的:

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

  4. 中使用列枚举类的文档

    根据此调查,建议反对尝试使用LibreOffice 4.1 Writer Basic宏执行任何有效的操作。

答案 1 :(得分:2)

最后我得到了这个问题的解决方案......

但仍然不知道位置属性的单位。

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

答案 2 :(得分:0)

我试图通过使用separators设置每行TableColumnRelativeSum的位置来设置表格中所有单元格的宽度到某个值,以计算相应的相对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提供了更多详细信息。