Macro per manipolare i bordi di una tabella
TDF LibreOffice Document Liberation Project Blog comunitari Weblate Nextcloud Redmine Ask LibreOffice Donazione
Descrizione
Questa macro manipola i bordi sia di un'intera tabella, sia di una singola cella.
Nota: può essere più efficiente manipolare i bordi usando gli stili, vedere https://ask.libreoffice.org/t/how-to-set-textframe-borders-at-once/108826
I bordi della tabella sono accessibili tramite la proprietà com.sun.star.table.TableBorder[1].
Gli elementi di questa struttura sono di due tipi:
- Bordi (superiore, inferiore, sinistro, destro, orizzontale e verticale); i bordi sono dati dalle strutture com.sun.star.table.BorderLine2[2] che "applica" degli elementi decorativi [3] alla struttura com.sun.star.table.BorderLine[4].
- Valori Booleani (IsLeftLineValid, IsRightLineValid, IsTopLineValid, ecc.). Quando vengo scritti, se si impostano come Vero si modifica la linea di conseguenza, mentre come Falso si ignorano, nel senso che vengono mantenuti i valori correnti.
L'impostazione della spaziatura rispetto al contenuto avviene tramite la proprietà della tabella com.sun.star.table.TableBorderDistances[5]. Questa struttura viene manipolata con lo stesso principio, usando i valori BottomDistance, LeftDistance, ecc. e dei valori booleani per modificarne il nome.
La macro seguente viene eseguita sulla tabella selezionata in quel momento. Nella macro, vengono eseguite le seguenti opeazioni:
- Inizia controllando che il cursore sia posizionato all'interno di una tabella;
- l'obiettivo è quello di sostituire i bordi correnti (il parametro Is... viene impostato su True) al fine di ottenere il perimetro esterno e linee doppie orizzontali. Non si vogliono ottenere delle linee verticali. Perciò sono necessari i valori .IsVerticalLineValid = true e VerticalLine = LibONoLine, una struttura definita al fine di assegnare il valore "empty" ad una linea. Non è possibile usare semplicemente .IsVerticalLineValid = false in quanto la tabella corrente potrebbe avere delle linee verticali già definite e si desidera eliminarle. Con il parametro false le linee esistenti rimarrebbero nello stesso stato in cui si trovano;
- lo spessore del bordo desiderato è di 0.30 cm;
- il parametro Unisci stili di riga adiacenti viene definito tramite la proprietà CollapsingBorders della tabella.
Codice
Le distanze e lo spessore delle linee dei Bordi sono espresse in 1/100 di mm.
LibreOffice Basic
{{#widget:Codetabs |name=BasicIDEexamples |titles=Basic |titles=Python |content.basic= Option Explicit
Sub Main()
Selezionate quale delle due subroutine chiamare, commentando quella che non volete usare
'AddBordersToAllCells _AddBordersToCell("Tabella1","B2")
End Sub ' Main
Sub AddBordersToAllCells()
Applica un doppio bordo a tutte le celle della tabella selezionata
Dim oCursor As Object Dim oTable As Object Dim oTableBorder As Object
Dim oLine As New com.sun.star.table.BorderLine2 Dim oNoLine As New com.sun.star.table.BorderLine2 Dim oBorderDistances As New com.sun.star.table.TableBorderDistances oCursor = ThisComponent.CurrentController.ViewCursor
If (isEmpty(oCursor.textTable)) Then MsgBox "Il cursore non si trova all'interno di una tabella.", _ MB_ICONINFORMATION, _ "Avvertimento della funzione AddBordersToAllCells()" Else With oLine .Color = 0 .InnerLineWidth = 10 .LineDistance = 60 .LineStyle = com.sun.star.table.BorderLineStyle.DOUBLE .LineWidth = 5 .OuterLineWidth = 10 End With With oNoLine .Color = 0 .InnerLineWidth = 0 .LineDistance = 0 .LineStyle = 0 .LineWidth = 0 .OuterLineWidth = 0 End With With oBorderDistances .BottomDistance = 300 .IsBottomDistanceValid = True .IsLeftDistanceValid = True .IsRightDistanceValid = True .IsTopDistanceValid = True .LeftDistance = 300 .RightDistance = 300 .TopDistance = 300 End With oTable = oCursor.TextTable oTableBorder = oTable.TableBorder With oTableBorder .IsLeftLineValid = true .IsRightLineValid = true .IsTopLineValid = true .IsBottomLineValid = true .IsHorizontalLineValid = true .IsVerticalLineValid = true .LeftLine = oLine .RightLine = oLine .TopLine = oLine .BottomLine = oLine .HorizontalLine = oLine .VerticalLine = oNoLine End With With oTable .TableBorder = oTableBorder .HoriOrient = com.sun.star.text.HoriOrientation.FULL .CollapsingBorders = true .TableBorderDistances = oBorderDistances End With
End If
End Sub ' AddBordersToAllCells
Private Sub _AddBordersToCell(myTable As String, myCell As String)
Applica un doppio bordo alla cella specificata di una determinata tabella
Dim oTable As Object Dim oCell As Object Dim oLine As New com.sun.star.table.BorderLine2
With oLine .Color = 0 .InnerLineWidth = 10 .LineDistance = 60 .LineStyle = com.sun.star.table.BorderLineStyle.DOUBLE .LineWidth = 2 .OuterLineWidth = 10 End With
oTable = ThisComponent.TextTables.getByName(myTable) oCell = oTable.getCellByName(myCell)
With oCell .LeftBorder = oLine .LeftBorderDistance = 100 .RightBorder = oLine .RightBorderDistance = 100 .TopBorder = oLine .TopBorderDistance = 100 .BottomBorder = oLine .BottomBorderDistance = 100 End With
End Sub ' AddBordersToCell |content.python=
- -*- coding: utf-8 -*-
from __future__ import unicode_literals from com.sun.star.table import BorderLine2 from com.sun.star.table import TableBorderDistances from com.sun.star.table.BorderLineStyle import DOUBLE import uno import msgbox from com.sun.star.text.HoriOrientation import FULL
def _msgbox(prompt=, title='LibreOffice'):
""" Visualizza una finestra di dialogo con un messaggio e restituisce un valore.""" mb = msgbox.MsgBox(uno.getComponentContext()) mb.addButton('OK') mb.show(prompt, 0, title)
def AddBordersToAllCells():
"""Applica un doppio bordo a tutte le celle della tabella selezionata""" desktop = XSCRIPTCONTEXT.getDesktop() model = desktop.getCurrentComponent() view_cursor = model.getCurrentController() cursor = view_cursor.getViewCursor() line = BorderLine2() no_line = BorderLine2() border_distances = TableBorderDistances() if cursor.TextTable is None: _msgbox("Il cursore non si trova all'interno di una tabella.", "Avvertimento della funzione AddBordersToAllCells()") else: line.Color = 0 line.InnerLineWidth = 10 line.LineDistance = 60 line.LineStyle = DOUBLE line.LineWidth = 5 line.OuterLineWidth = 10
no_line.Color = 0 no_line.InnerLineWidth = 0 no_line.LineDistance = 0 no_line.LineStyle = 0 no_line.LineWidth = 0 no_line.OuterLineWidth = 0
border_distances.BottomDistance = 300 border_distances.IsBottomDistanceValid = True border_distances.IsLeftDistanceValid = True border_distances.IsRightDistanceValid = True border_distances.IsTopDistanceValid = True border_distances.LeftDistance = 300 border_distances.RightDistance = 300 border_distances.TopDistance = 300
table = cursor.TextTable table_border = table.TableBorder table_border.IsLeftLineValid = True table_border.IsRightLineValid = True table_border.IsTopLineValid = True table_border.IsBottomLineValid = True table_border.IsHorizontalLineValid = True table_border.IsVerticalLineValid = True table_border.LeftLine = line table_border.RightLine = line table_border.TopLine = line table_border.BottomLine = line table_border.HorizontalLine = line table_border.VerticalLine = no_line
table.TableBorder = table_border table.CollapsingBorders = True table.TableBorderDistances = border_distances
def Main():
_AddBordersToCell("Tabella1", "B2")
def _AddBordersToCell(my_table, my_cell):
"""Applica un doppio bordo alla cella specificata di una determinata tabella""" desktop = XSCRIPTCONTEXT.getDesktop() model = desktop.getCurrentComponent()
line = BorderLine2() line.Color = 0 line.InnerLineWidth = 10 line.LineDistance = 60 line.LineStyle = DOUBLE line.LineWidth = 2 line.OuterLineWidth = 10
table = model.TextTables.getByName(my_table) cell = table.getCellByName(my_cell)
cell.LeftBorder = line cell.LeftBorderDistance = 100 cell.RightBorder = line cell.RightBorderDistance = 100 cell.TopBorder = line cell.TopBorderDistance = 100 cell.BottomBorder = line cell.BottomBorderDistance = 100
g_exportedScripts = (AddBordersToAllCells, Main)
</syntaxhighlight>
File per provare la macro in Writer
Note
- ↑ Vedete la documentazione dell'API relativa a com.sun.star.table.TableBorder
- ↑ Vedete la documentazione dell'API relativa a com.sun.star.table.BorderLine2
- ↑ Vedete la documentazione dell'API relativa a com.sun.star.table.BorderLineStyle
- ↑ Vedete la documentazione dell'API relativa a com.sun.star.table.BorderLine
- ↑ Vedete la documentazione dell'API relativa a com.sun.star.table.TableBorderDistances