Jump to content

Macros/Writer/003/es

From The Document Foundation Wiki
This page is a translated version of the page Macros/Writer/003 and the translation is 100% complete.


Descripción

Esta macro manipula los bordes de una tabla completa o de una única celda

Nota: podría ser más eficiente manipular bordes usando estilos, consulte la página siguiente (en inglés)

Los bordes de la tabla son accesibles mediante la propiedad com.sun.star.table.TableBorder[1].

Los elementos de esta estructura constan de dos tipos :

  • Bordes (upper, lower, left, right, horizontal, vertical); los bordes se encuentran en la estructura com.sun.star.table.BorderLine2[2] que añade elementos con estilos[3] para la estructura com.sun.star.table.BorderLine[4].
  • Valores booleanos (IsLeftLineValid, IsRightLineValid, IsTopLineValid, etc.). Al escribir, definalos como True para modificar la linea correspondiente, y False para ignorarla; teniendo en cuenta su valor actual.

La definición del espaciado con el contenido se consigue mediante la propiedad com.sun.star.table.TableBorderDistances[5] de la tabla. Esta estructura se manipula con el mismo principio, usando BottomDistance, LeftDistance, etc. y valores booleanos para modificarlos.

La siguiente macro se ejecuta en una tabla previamente seleccionada. Con la macro haremos:

  • Comprobamos que el cursor está dentro de una tabla
  • El objetivo es reemplazar los bordes actuales (los parámetros Is... están definidos como True) para obtener un perímetro externo de dobles lineas horizontales. No queremeos líneas verticales. Por tanto, necesitamos .IsVerticalLineValid = true y VerticalLine = LibONoLine, una estructura definida para aplicar "vacío" a una línea. No podemos usar simplemente .IsVerticalLineValid = false puesto que la tabla puede tener líneas verticales ya definidas y queremos eliminarlas. Con el parámero false, las líneas existentes se quedarían como estaban.
  • El ancho del borde lo estableceremos en 0,30 cm.
  • El parámetro Fusionar con las lineas adyacentes está definido por la propiedad de la tabla CollapsingBorders.

Código

Las línea del borde, distancias y anchura se expresan en 1/100 mm.

Option Explicit


Sub Main()
    '''Elige a cual de las dos subrutinas llamar, comentando la que no quieras.'''

    'BordesATodasCeldas
    _BordesALaCelda("Tabla1","B2")

End Sub ' Main


Sub BordesATodasCeldas()
    ''' Agrega bordes con doble linea a todas las celdas de la tabla seleccionada'''

    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 "El cursor no está en ninguna tabla.", _
            MB_ICONINFORMATION, _
            "Advertencia de BordesATodasCeldas"
    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 ' BordesATodasCeldas


Private Sub _BordesALaCelda(myTable As String, myCell As String)
    '''Agrega bordes con doble linea a una celda de la tabla seleccionada'''

    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 ' _BordesALaCelda
# -*- 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'):
    """ Muestra un diálogo con un mensaje y devuelve un valor."""
    mb = msgbox.MsgBox(uno.getComponentContext())
    mb.addButton('OK')
    mb.show(prompt, 0, title)


def BordesATodasCeldas():
    """Agrega bordes con doble linea a todas las celdas de la tabla seleccionada"""
    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("El cursor no está en una tabla.", "Advertencia de BordesATodasCeldas()")
    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():
    _BordesALaCelda("Table1", "B2")


def _AddBordersToCell(my_table, my_cell):
    """Agrega bordes con doble línea a una celda en la tabla seleccionada"""
    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 = (BordesATodasCeldas, Main)

Documento de Writer para probar la macro

Notas