Macros/Writer/003/es
TDF LibreOffice Document Liberation Project Blogs comunitarios Weblate Nextcloud Redmine Ask LibreOffice Donar
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
- ↑ Consulte la documentación de la API sobre com.sun.star.table.TableBorder
- ↑ Consulte la documentación de la API sobre com.sun.star.table.BorderLine2
- ↑ Consulte también la documentación de la API sobre com.sun.star.table.BorderLineStyle
- ↑ Consulte la documentación de la sobre com.sun.star.table.BorderLine
- ↑ Consulte la documentación de la API sobre com.sun.star.table.TableBorderDistances