4

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

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

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

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

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

  2. 将第一列/行调整为一些仔细计算的宽/高,然后调用均匀分布列/行

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

有没有人做过这样的事情?

4

3 回答 3

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 中使用列枚举类的文档

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

于 2013-11-03T11:31:53.610 回答
3

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

但仍然不知道 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
于 2013-12-12T10:58:22.750 回答
0

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

表格的实际宽度取决于环境(页面样式和表格位置处的文本列数、对齐方式以及左右边距)。因此,表格列分隔符不包含列宽的度量值。这些值与属性 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 脚本将键盘输入发送到 LibreOffice,使用xdotool.

在 LibreOffice 网站上有更多关于这个问题的详细信息。

于 2015-02-27T05:19:16.443 回答