2013-10-26 19 views
5

Ich arbeite an einigen LibreOffice-Makros, die an Tabellen arbeiten, insbesondere um die Breite und Höhe jeder Spalte und Zeile auf 0,85 cm (0,335 Zoll) festzulegen.LibreOffice 4.1 Writer: Makro zum Anpassen der Spaltenbreiten in Tabellen

In MS Office, das ist einfach, nur die Tabelle auswählen und im Makro hat:

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

Es wie dies in Libreoffice 4.1 nichts ist. Es scheint, dass jede Spalte/Zeile einzeln angepasst werden muss. Zwei Wege, dies zu tun:

  1. Iterate durch alle Spalten/Zeilen und stellen Sie jede Spalte/Zeile

  2. die erste Spalte einstellen/Zeile bis zu einem gewissen sorgfältig berechnet großen Breite/Höhe, dann rufen verteilen Spalten/Zeilen gleichmäßig

nur eine Idee des Codes zu bekommen, habe ich versucht, den Makro-Recorder und ging durch Tabelle | Tabelle Eigenschaften und spielte herum, bis der Tisch in Ordnung, aber das meiste von dem, was ich tat, wurde nicht im Makro aufgezeichnet.

Hat jemand so etwas getan?

Antwort

4

ist hier so weit wie ich bekommen konnte:

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 

Hauptprobleme festgestellt:

  1. keine Möglichkeit, die aktuelle Tabelle, die Sie über ThisComponent.CurrentSelection, so stattdessen fest einprogrammiert ändern möchten abrufen zu der Tabelle bei Index 0

  2. Alle Änderungen an der Tabelle scheinen nicht zu sein im Dokument aufgegriffen, und keine offensichtliche Möglichkeit zum Rendern oder Aktualisieren Scheint jetzt zu arbeiten! Aber immer noch nach einem Weg, um die Funktion aufzurufen Spalten gleichmäßig zu verteilen

  3. columns.getByIndex immer wieder NULL!, Und es gibt keine Dokumentation, wie die Spalte Enumerationsklasse verwenden innerhalb von Grunde

Auf der Grundlage dieser Untersuchung , würde empfehlen gegen versuchen, etwas produktives mit LibreOffice 4.1 Writer Basic-Makros zu tun.

2

Endlich ich die Lösung für dieses Problem bekam ...

aber immer noch nicht wissen, die Einheit für Positionseigenschaften, was.

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 
+0

Vielen Dank für Ihre Ausdauer! Die Umwandlung beträgt 1 Einheit = 10 um = 0,01 mm = 0,001 cm, also: 26000 Einheiten = 260 mm = 26 cm und 1600 Einheiten = 16 mm = 1,6 cm –

+0

Funktioniert gut zum Einstellen der Breite der ersten Spalte. –

0

Ich versuche, die Breite aller Zellen in einer Tabelle auf einen bestimmten Wert einzustellen, indem die Position jeder Zeile der Einstellung separatorsTableColumnRelativeSum der unter Verwendung der entsprechenden relativen Position zu berechnen.Es ist notwendig, die relativen Werte zu verwenden, da, wie die TableColumnSeparator docs erklären:

Die wirkliche Breite einer Tabelle auf die Umwelt (Seitenstil und die Anzahl der Textspalten in der Tabelle die Position, Ausrichtung abhängt und linken und rechten Rand). Aus diesem Grund enthält das Tabellenspaltentrennzeichen keine Metrikwerte für die Spaltenbreiten. Die Werte sind relativ zum Wert der Eigenschaft TextTable :: TableColumnRelativeSum.

Also ich habe diesen Code, und es läuft ohne Fehler, und es scheint zu funktionieren. Bei einigen Tabellen ("komplexe", bei denen nicht alle Zeilen identisch sind) werden einige Trennzeichen jedoch nicht verschoben.

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 

Ich stelle dies hier, weil es sich um ein echtes Chaos gewesen versucht, es herauszufinden, und vielleicht wird dies jemand eines Tages helfen.

Am Ende funktionierte am besten mit einem Bash-Skript, um Tastatureingabe an LibreOffice mit xdotool zu senden.

Es gibt weitere Details unter this question auf der LibreOffice-Website.