2008-09-16 12 views
7

Estoy tratando de usar Python con ReportLab 2.2 para crear un informe en PDF.
De acuerdo con la user guide,Python Uso de ReportLab de splitfirst/splitlast

especiales TableStyle Indices de [sic]

En cualquier comando estilo el primer índice de la fila puede ajustarse a una de las cadenas especiales 'splitlast' o 'splitfirst' para indicar que el estilo debe usarse solo para la última fila de una tabla dividida, o la primera fila de una continuación. Esto permite dividir las tablas con mejores efectos alrededor de la división.

He intentado usar varios elementos de estilo, incluyendo:

('TEXTCOLOR', (0, 'splitfirst'), (1, 'splitfirst'), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, 0), colors.black) 
('TEXTCOLOR', (0, 'splitfirst'), (1, -1), colors.black) 

y ninguno de ellos parece funcionar. La primera genera un TypeError con el mensaje:

TypeError: cannot concatenate 'str' and 'int' objects 

y los dos últimos generan TypeErrors con el mensaje:

TypeError: an integer is required 

¿Es esta funcionalidad simplemente rota o estoy haciendo algo mal? Si esto último, ¿qué estoy haciendo mal?

Respuesta

0

[...] En cualquier comando estilo la primera fila índice de se puede fijar a una de las cadenas especiales [...]

En el primer ejemplo se está configurando el segundo índice de fila a una cadena especial también.

No estoy seguro de por qué los otros dos no funcionan ... ¿Está seguro de que de aquí viene la excepción?

+0

He tenido algo de tiempo para ver el código fuente de ReportLab. Parece que lo que se supone que ocurre es que tanto la fila de inicio como el índice de la fila final se reemplazan por el índice de fila del inicio de la página a medida que el programa se desenrolla. Si esto funciona correctamente, el índice de la segunda fila no debería importar. – DLJessup

3

Bueno, parece que voy a responder a mi propia pregunta. En primer lugar, la documentación dice: "En cualquier comando de estilo, el índice de la primera fila puede establecerse en una de las cadenas especiales 'splitlast' o 'splitfirst' para indicar que el estilo debe usarse solo para el última fila de una mesa dividida, o la primera fila de una continuación ". En la versión actual, los índices de filas "splitlast" y "splitfirst" rompen con los TypeErrors antes mencionados en las referencias TEXTCOLOR y BACKGROUND.

Mi sospecha, basada en la lectura del código fuente, es que solo los comandos de líneas de cuadros (GRID, BOX, LINEABOVE y LINEBELOW) son actualmente compatibles con los índices de filas 'splitfirst' y 'splitlast'. Sospecho que todos los comandos de celda rompen con los TypeErrors antes mencionados.

Sin embargo, pude hacer lo que quería subclasificando la clase Table y anulando el método onSplit. Aquí está mi código:

class XTable(Table): 
    def onSplit(self, T, byRow=1): 
     T.setStyle(TableStyle([ 
      ('TEXTCOLOR', (0, 1), (1, 1), colors.black)])) 

Lo que esto hace es aplicar el color del texto negro para la primera y la segunda celda de la segunda fila de cada página. (La primera fila es un encabezado, repetido por el parámetro repeatRows de la Tabla). Más precisamente, lo está haciendo a la primera y segunda celda de cada cuadro, pero como estoy usando SimpleDocTemplate, los marcos y las páginas son idénticos.

1

Esto parece ser un error en la clase ReportLab Table. Otra solución para este además de DLJessup's own answer es modificar el código ReportLab que está causando el error, en Table._drawBkgrnd(), alrededor de la línea 1301. Para 'splitlast', cambie:

y0 = rowpositions[sr] 

a:

if sr == 'splitlast': 
    y0 = rowpositions[-2] # last value is 0. Second last is the one we want. 
else: 
    y0 = rowpositions[sr] 

Este se realiza fácilmente en su propio código sin hackear ReportLab subclasificando Table y sobrescribiendo este método. No he tenido necesidad de usar 'splitfirst'; si lo hago, publicaré el resto del truco aquí.

Cuestiones relacionadas