es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Reportlab utiliza un bucle for para crear múltiples tablas.

1) Necesito crear más tablas a través de un bucle for, creo que funciona pero necesito cambiar las varias coordenadas, ¿cómo puedo hacerlo?

2) ¿Es posible cambiar el ancho de una sola fila de una tabla? o en cualquier caso, ¿traer su alineación de texto hacia la izquierda pero que comience desde donde comienza la tabla?

def testPdfView(request, id):

#datos iniciales
scheda = get_object_or_404(Schede, pk=id)
filename = 'media/pdf/' + scheda.nome_scheda + '.pdf'
titolo = scheda.utente.username + ' - ' + scheda.nome_scheda

#crear archivo
doc = SimpleDocTemplate(
    filename,
    pagesize=A4,
    rightMargin=10*mm,
    leftMargin=10*mm,
    topMargin=47*mm,
    bottomMargin=10*mm
)

#título
doc.title = titolo

#pasar hoja a la función pdfCanvas
doc.scheda = scheda

#tabla de grupos
gruppi = DatiGruppi.objects.filter(gruppi_scheda=id)
for gruppo in gruppi:
    table = Table([
        [str(gruppo).upper()]
    ], colWidths=180*mm, repeatRows=1)

#estilo de la tabla
style = TableStyle([
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.HexColor("#9FFC0D")), #-1 significa el último elemento 
    ('FONTNAME', (0, 0), (0, 0), 'bulk_bold'),
    ('FONTSIZE', (0, 0), (0, 0), 6*mm),
    ('BOTTOMPADDING', (0, 0), (-1, 0), 6*mm),
    ('LINEBELOW', (0, 0), (-1, 0), 1, colors.HexColor("#9FFC0D")),
])
table.setStyle(style)

#agregar tabla a la plantilla
elems = []
elems.append(table)

#crear
doc.build(elems, onFirstPage=pdfCanvas)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    1) Para cambiar las diferentes coordenadas en un bucle for mientras se crean tablas, se puede considerar definir variables para esas coordenadas y actualizarlas dentro de cada iteración del bucle. Por ejemplo, si necesita actualizar el margen izquierdo para cada tabla, puede definir una variable ‘left’ e incrementarla en un valor fijo dentro del bucle, de la siguiente manera:

    left = 10*mm # margen izquierdo inicial
    for i in range(num_tables):
        table = Table([...], leftMargin=left, [...])
        left += 20*mm # incrementar el margen izquierdo para cada tabla en 20mm
    

    2) Sí, es posible ajustar el ancho de una sola fila o alinear su contenido a la izquierda. Para ajustar el ancho de una sola fila, puede definir una lista de anchos de columna y pasarla al parámetro rowHeights de la tabla. Por ejemplo, para hacer que la segunda fila sea más ancha que las demás:

    table = Table([
        ['Encabezado 1', 'Encabezado 2', 'Encabezado 3'],
        ['Datos 1', 'Datos 2', 'Datos 3'],
        ['Más datos 1', 'Más datos 2', 'Más datos 3'],
        ['Pie de página 1', 'Pie de página 2', 'Pie de página 3'],
    ], colWidths=[50*mm, 100*mm, 50*mm], rowHeights=[None, 20*mm, None, None])
    

    Para alinear el contenido de una fila a la izquierda, puede definir un ParagraphStyle con alignment=TA_LEFT y aplicarlo a las celdas de esa fila utilizando el método addStyle del objeto Style de la tabla. Por ejemplo, para alinear la segunda fila a la izquierda:

    from reportlab.lib.styles import ParagraphStyle
    from reportlab.lib.enums import TA_LEFT
    
    # definir un estilo de párrafo alineado a la izquierda
    left_style = ParagraphStyle(name='left', alignment=TA_LEFT)
    
    table = Table([
        ['Encabezado 1', 'Encabezado 2', 'Encabezado 3'],
        ['Datos 1', 'Datos 2', 'Datos 3'],
        ['Más datos 1', 'Más datos 2', 'Más datos 3'],
        ['Pie de página 1', 'Pie de página 2', 'Pie de página 3'],
    ], colWidths=[50*mm, 100*mm, 50*mm])
    
    # aplicar el estilo de la izquierda a la segunda fila
    for col in range(table.columns):
        table.setStyle([('STYLE', (col, 1), (col, 1), left_style)])
    

Comments are closed.