Comment gérer les bordures d'un tableau ?

From The Document Foundation Wiki
< Macros‎ | Writer
Jump to: navigation, search
This page is a translated version of the page Macros/Writer/003 and the translation is 100% complete.

Other languages:
English • ‎français

Description

On souhaite gérer par programme la définition des bordures d'un tableau ou d'une cellule.

Les bordures sont accessibles via la propriété com.sun.star.table.TableBorder[1].

Les éléments de cette structure sont de deux types :

  • Des bordures (haut, bas, gauche, droite, horizontale, verticale) ; les bordures sont des structures com.sun.star.table.BorderLine2[2] qui "ajoutent" les éléments de style[3] à la structure com.sun.star.table.BorderLine[4].
  • Des booléens (IsLeftLineValid, IsRightLineValid, IsTopLineValid, etc.). En écriture, les définir à True pour modifier la ligne correspondante et à False pour l'ignorer, autrement dit pour garder sa valeur actuelle.

La définition de l'espacement avec le contenu se fait via la propriété com.sun.star.table.TableBorderDistances[5] de la table. Là encore il s'agit d'une structure bâtie selon le même principe : BottomDistance, LeftDistance, etc. et des booléens pour gérer la modification ou non.

La procédure suivante s'applique au tableau courant :

  • On commence par tester que le curseur figure bien dans un tableau.
  • L'objectif est de remplacer les bordures actuelles (les paramètres Is... sont définis à True) pour obtenir un encadrement extérieur et des lignes horizontales doubles. En revanche on ne veut pas de lignes verticales. Il faut en conséquence .IsVerticalLineValid = true et VerticalLine = LibONoLine, une structure définie pour appliquer une ligne "vide". On ne peut simplement utiliser .IsVerticalLineValid = false car le tableau courant peut avoir des lignes verticales définies et on désire les supprimer. Avec le paramètre false les lignes existantes seraient laissées dans leur état actuel.
  • L'espacement avec le contenu désiré est 0,30cm.
  • Le paramètre Fusionner les styles de ligne adjacents se définit par la propriété CollapsingBorders de la table.

Code

En LibreOffice Basic:

Option Explicit


Sub Main()
    '''Choisissez laquelle des deux sous-routines vous voulez appeler, en commentant celle que vous ne voulez pas.'''

    EncadrerTableCourante
    'EncadrerCell("Tableau1","B2")

End Sub ' Main


Sub EncadrerTableCourante()
    '''Encadrer un tableau avec des traits dans toutes les cellule'''

    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 "Le curseur n'est pas dans un tableau", 64, "Mise en forme du tableau"
    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 ' EncadrerTableCourante


Sub EncadrerCell(myTable As String, myCell As String)
    ''''''Encadrer une cellule spécifique dans un tableau traits doubles, espacement 0.10cm''''''

    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 ' EncadrerCell

Fichier ODT pour tester la macro

Notes