Macro per manipolare i bordi di una tabella

    From The Document Foundation Wiki
    < Macros‎ | Writer
    This page is a translated version of the page Macros/Writer/003 and the translation is 92% complete.
    Outdated translations are marked like this.


    Other languages:

    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=

    1. -*- 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>

    Note