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.
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
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
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)
File ODT di esempio con la macro
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