我正在研究一些适用于表格的 LibreOffice 宏,特别是将每列和每行的宽度和高度设置为 0.85 厘米(0.335 英寸)。
在MS Office中,这很容易,只需选择表格并在宏中具有:
Selection.Rows.Height = CentimetersToPoints(0.85)
Selection.Columns.PreferredWidth = CentimetersToPoints(0.85)
在LibreOffice 4.1中没有这样的东西。似乎每列/行都必须单独调整。有两种方法可以做到这一点:
遍历所有列/行并调整每一列/行
将第一列/行调整为一些仔细计算的宽宽/高,然后调用均匀分布列/行
只是为了了解代码,我尝试使用宏录制器并浏览了表 |表属性并玩到表看起来没问题,但我所做的大部分内容都没有记录在宏中。
有没有人做过这样的事情?
这是我所能得到的:
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
注意到的主要问题:
无法通过
ThisComponent.CurrentSelection
检索要修改的实际表,因此硬编码到索引 0 处的表columns.getByIndex
总是返回NULL
!,并且没有关于如何在 Basic 中使用列枚举类的文档
基于此调查,建议不要尝试使用LibreOffice 4.1 Writer Basic宏做任何富有成效的事情。
终于我得到了这个问题的解决方案......
但仍然不知道位置属性的单位是什么。
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
我试图通过使用 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 脚本使用 xdotool
将键盘输入发送到 LibreOffice。
LibreOffice 网站上有关于这个问题的更多详细信息。