Macro per manipolare i bordi di una tabella

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 • ‎italiano

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