2013-10-26 21 views
5

Sto lavorando su alcune macro di LibreOffice che funzionano sulle tabelle, in particolare per impostare la larghezza e l'altezza di ogni colonna e riga a 0,85 cm (0,335 pollici).LibreOffice 4.1 Writer: macro per regolare le larghezze delle colonne nelle tabelle

in MS Office, questo è facile, basta selezionare la tabella e nella macro avere:

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

Non c'è nulla di simile in LibreOffice 4.1. Sembra che ogni colonna/riga debba essere regolata individualmente. Due modi per farlo:

  1. scorrere tutti i colonne/righe e regolare ogni colonna/fila

  2. Regolare la prima colonna/riga per qualche un'ampia larghezza/altezza attentamente calcolato, quindi chiamare Distribuire colonne/righe uniformemente

Giusto per avere un'idea del codice, ho provato ad utilizzare il registratore di macro e ha attraversato da tavolo | Tabella Proprietà e giocato fino a quando il tavolo sembrava ok, ma la maggior parte di quello che ho fatto non è stato registrato nella macro.

Qualcuno ha fatto qualcosa del genere?

risposta

4

Ecco quanto ho potuto ottenere:

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 

principali problemi noti:

  1. Non c'è modo di recuperare la tabella effettiva che si desidera modificare tramite ThisComponent.CurrentSelection, così invece hard-coded al tavolo all'indice 0

  2. Qualsiasi modifica al tavolo non sembra essere r riflessa nel documento, e nessun modo ovvio per ri-renderizzare o aggiornare Sembra che funzioni adesso! Ma ancora alla ricerca di un modo per chiamare la funzione di distribuire uniformemente colonne

  3. columns.getByIndex restituisce sempre NULL!, E non c'è alcuna documentazione su come utilizzare la classe di colonna di enumerazione all'interno di base

Sulla base di questa indagine , consiglierebbe contro cercando di fare qualcosa di produttivo con le macro di LibreOffice 4.1 Writer Basic.

2

Finalmente ho avuto la soluzione per questo problema ...

Ma ancora non so cosa l'unità per le proprietà di posizione.

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

Grazie per la vostra perseveranza! La conversione è 1 unità = 10 μm = 0,01 mm = 0,001 cm, quindi: 26000 unità = 260 mm = 26 cm e 1600 unità = 16 mm = 1,6 cm –

+0

Funziona bene per impostare la larghezza della prima colonna. –

0

Sto tentando di impostare la larghezza di tutte le celle in una tabella di un certo valore impostando la posizione di ogni fila di separators usando l'TableColumnRelativeSum per calcolare la relativa appropriata Position.E 'necessario utilizzare i valori relativi, perché, come il TableColumnSeparator docs spiegare:

La vera larghezza di una tabella dipende dall'ambiente (stile di pagina e il numero di colonne di testo alla posizione del tavolo, l'allineamento e margini destro e sinistro). Per questo motivo, il separatore della colonna della tabella non contiene valori di metrica per le larghezze della colonna. I valori sono relativi al valore della proprietà TextTable :: TableColumnRelativeSum.

Quindi ho questo codice e funziona senza errori e sembra funzionare. Su alcune tabelle, tuttavia (quelle "complesse" in cui non tutte le righe sono identiche), alcuni separatori non vengono spostati.

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 

sto mettendo questo qui perché è stato un vero e proprio pasticcio cercando di capirlo, e forse questo aiuterà qualcuno un giorno.

Alla fine, ciò che ha funzionato meglio era usare uno script Bash per inviare l'input da tastiera a LibreOffice usando xdotool.

Ci sono ulteriori dettagli disponibili su this question sul sito di LibreOffice.