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 100% complete.


    Other languages:

    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