[Python-es] Reportlab - Contenido de Tablas sin ajuste a celdas

1,224 views
Skip to first unread message

Roldan Darío Vargas Gómez

unread,
Jul 19, 2012, 11:10:02 AM7/19/12
to pyth...@python.org
Buenos días

Ante todo un cordial saludo a todos los miembros de esta lista.

Soy nuevo en esta lista, y me gustar saber si alguno de los miembros de la lista posee, tiene, o dispone de alguna solución para un inconveniente que poseo (del cual no he encontrado la respuesta en Internet) al momento de generar un reporte en PDF con ReportLab usando la clase Table del módulo platypus.

La interrogante es que al querer generar una tabla en el reporte y la misma posee cierta cantidad de celdas con un texto variable extraído de una base de datos el cual puede ser muy pequeño y/o muy grande, el contenido se excede de los límites de la celda y lo que deseo es que al llegar a dicho límite el texto continúe en la siguiente línea de la misma celda.

Un extracto del código que realiza la operación para la generación del reporte es el siguiente:

--------------------///----------------------///--------------------------///------------------------
from reportlab.platypus import SimpleDocTemplate, Table
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import LETTER, landscape, portrait
from reportlab.lib.enums import TA_CENTER

estiloHoja = getSampleStyleSheet()
story = []
cuerpo = estiloHoja["BodyText"]
cuerpo.alignment=TA_CENTER

datos = [[texto1_bd,texto2_bd,texto3_bd],[texto4_bd,texto5_bd,texto6_bd]] #donde textox_bd es el texto que proviene directamente de la Base de datos

tabla = Table(data=datos,colWidths=[80,450,50])

story.append(tabla)

doc = SimpleDocTemplate("reporte.pdf",pagesize=portrait(LETTER), leftMargin=1, rightMargin=1, topMargin=2, bottomMargin=2)
doc.build(story)

--------------------///----------------------///--------------------------///------------------------


El resultado en el archivo PDF se puede ver de la siguiente manera:

______________________________________
| encabezado1 | encabezado2 | encabezado3 |
| ejemplo txt    | texto 2           | este texto deb|ería ir en la siguiente línea de esta celda


--------------------///----------------------///--------------------------///------------------------

Mucho sabría agradecer si alguien puede darme luces para poder solventar este inconveniente.

De antemano gracias y saludos...


--------------------------------------
Ing. Roldan D. Vargas G.
Analista Desarrollador
Linux Counter 400001

Jose Caballero

unread,
Jul 19, 2012, 12:09:39 PM7/19/12
to La lista de python en castellano
Hola,


Nunca he usado reportlab, por lo que no puedo ser de gran ayuda.
Aun asi he buscado en google "reportlab platypus wrap text in cell" y creo que el primer link tiene la solucion. O al menos te dara una idea de por donde seguir investigando.


Suerte,
Jose
[perdon por la ausencia de tildes]

Roldan Darío Vargas Gómez

unread,
Jul 19, 2012, 3:40:35 PM7/19/12
to La lista de python en castellano
Buenas tardes

Gracias por indicarme el camino a seguir para solventar el inconveniente presentado, me fue de mucha utilidad para realizar los correctivos necesarios y así obtener la salida esperada.

Saludos,

--------------------------------------
Ing. Roldan D. Vargas G.
Analista Desarrollador
Linux Counter 400001



_______________________________________________
Python-es mailing list
Pyth...@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Marcos Sánchez Provencio

unread,
Jul 20, 2012, 4:35:16 AM7/20/12
to pyth...@python.org
El 19/07/12 21:40, Roldan Darío Vargas Gómez escribió:
> Buenas tardes
>
> Gracias por indicarme el camino a seguir para solventar el
> inconveniente presentado, me fue de mucha utilidad para realizar los
> correctivos necesarios y así obtener la salida esperada.
>
>
Y la costumbre indica que tienes que contarnos cómo lo has solucionado... ;)

Roldan Darío Vargas Gómez

unread,
Jul 20, 2012, 11:46:03 AM7/20/12
to La lista de python en castellano
Disculpen la falta de tacto en la resolución del problema.

Gracias al indicio de como buscar ofrecido por José Caballero pude identificar la manera correcta de generar el reporte. La solución al mismo fue bastante sencilla, el código es el siguiente:

--------------------///----------------------///--------------------------///------------------------

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import LETTER, landscape, portrait
from reportlab.lib.enums import TA_CENTER

estiloHoja = getSampleStyleSheet()
story = []

#Estilos de la tabla para cabeceras y datos
thead = estiloHoja["Normal"]
thead.alignment=TA_CENTER
tbody = estiloHoja["BodyText"]
tbody.alignment=TA_LEFT

#donde textox_bd es el texto que proviene directamente de la BD
datos = [[Paragraph(str(texto1_bd),thead),Paragraph(str(texto2_bd),thead),Paragraph(str(texto3_bd),thead)],
             [Paragraph(texto4_bd,tbody),Paragraph(texto5_bd,tbody),Paragraph(texto6_bd,tbody)]]

tabla = Table(data=datos,colWidths=[80,450,50])
tabla.setStyle(TableStyle([('INERGRID', (0,0),(-1,-1),0.25, color.black),
                                       ('BOX',(0,0),(-1,-1),0.25,color.black),]))

story.append(tabla)

doc = SimpleDocTemplate("reporte.pdf",pagesize=portrait(LETTER), leftMargin=1, rightMargin=1, topMargin=2, bottomMargin=2)
doc.build(story)

--------------------///----------------------///--------------------------///------------------------
El resultado en el archivo PDF se puede ver de la siguiente manera:

______________________________________
| encabezado1 | encabezado2 | encabezado3 |
| ejemplo txt    | texto 2           | este texto     |
|                     |                      | deb|ería ir en |
|                     |                      | la siguiente   |
|                     |                      | línea de esta |
|                     |                      | celda            |

--------------------///----------------------///--------------------------///------------------------

La solución al inconveniente fue tan sencilla como hacer uso de la clase Paragraph la cual ajusta el texto a las dimensiones de la celda en la que se encuentre.

Espero que sea de utilidad para cualquiera que se encuentre con este inconveniente, que a simple vista no parece sencillo pero que en realidad (indagando un poco) si lo es.

Saludos y feliz tarde

--------------------------------------
Ing. Roldan D. Vargas G.
Analista Desarrollador
Linux Counter 400001



Reply all
Reply to author
Forward
0 new messages