Python Reportlab 划分表格以适应不同的页面

问题描述

我正在尝试使用 ReportLab 生成的 PDF 文件构建日程计划器。根据一天中的时间,日程安排会有不同的行:从早上 8:00、早上 8:15、早上 8:30 开始,依此类推。

我做了一个循环,在这个循环中将自动计算小时数并填写时间表。但是,由于我的表格太长,它不能完全适应页面。 (虽然应该在晚上7:30结束,但在下午2:00被截断了)

期望的结果是当表格有大约 20 个活动时有一个分页符。在下一页,标题应该与第一页和下面的表格完全相同,表格的延续。每次需要时都应重复该过程,直到表结束。

enter image description here

Python 代码如下:

from reportlab.pdfgen.canvas import Canvas
from datetime import datetime,timedelta
from reportlab.platypus import Table,TableStyle
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter,landscape


class Vendedor:
    """
    Información del Vendedor: Nombre,sucursal,meta de venta
    """
    def __init__(self,nombre_vendedor,dia_reporte):
        self.nombre_vendedor = nombre_vendedor
        self.sucursal = sucursal
        self.dia_reporte = dia_reporte


class Actividades:
    """
    Información de las Actividades realizadas: Hora de actividad y duración,cliente atendido,tipo de actividad,resultado,monto venta (mxn) + (usd),monto cotización (mxn) + (usd),solicitud de apoyo y comentarios adicionales
    """
    def __init__(self,hora_actividad,duracion_actividad,cliente,tipo_actividad,monto_venta_mxn,monto_venta_usd,monto_cot_mxn,monto_cot_usd,requiero_apoyo,comentarios_extra):
        self.hora_actividad = hora_actividad
        self.duracion_actividad = duracion_actividad
        self.cliente = cliente
        self.tipo_actividad = tipo_actividad
        self.resultado = resultado
        self.monto_venta_mxn = monto_venta_mxn
        self.monto_venta_usd = monto_venta_usd
        self.monto_cot_mxn = monto_cot_mxn
        self.monto_cot_usd = monto_cot_usd
        self.requiero_apoyo = requiero_apoyo
        self.comentarios_extra = comentarios_extra


class PDFReport:
    """
    Crea el Reporte de Actividades diarias en archivo de formato PDF
    """
    def __init__(self,filename):
        self.filename = filename


vendedor = Vendedor('John Doe','Stack Overflow',datetime.now().strftime('%d/%m/%Y'))

file_name = 'cronograma_actividades.pdf'
document_title = 'Cronograma Diario de Actividades'
title = 'Cronograma Diario de Actividades'
nombre_colaborador = vendedor.nombre_vendedor
sucursal_colaborador = vendedor.sucursal
fecha_actual = vendedor.dia_reporte


canvas = Canvas(file_name)
canvas.setPageSize(landscape(letter))
canvas.setTitle(document_title)


canvas.setFont("Helvetica-Bold",20)
canvas.drawCentredString(385+100,805-250,title)
canvas.setFont("Helvetica",16)
canvas.drawCentredString(385+100,785-250,nombre_colaborador + ' - ' + sucursal_colaborador)
canvas.setFont("Helvetica",14)
canvas.drawCentredString(385+100,765-250,fecha_actual)

title_background = colors.fidblue
hour = 8
minute = 0
hour_list = []

data_actividades = [
    {'Hora','Cliente','Resultado de \nActividad','Monto Venta \n(MXN)','Monto Venta \n(USD)','Monto Cotización \n(MXN)','Monto Cotización \n(USD)','Comentarios \nAdicionales'},]

i = 0
for i in range(47):

    if minute == 0:
        if hour <= 12:
            time = str(hour) + ':' + str(minute) + '0 a.m.'
        else:
            time = str(hour-12) + ':' + str(minute) + '0 p.m.'
    else:
        if hour <= 12:
            time = str(hour) + ':' + str(minute) + ' a.m.'
        else:
            time = str(hour-12) + ':' + str(minute) + ' p.m.'

    if minute != 45:
        minute += 15
    else:
        hour += 1
        minute = 0
    hour_list.append(time)

    # I TRIED THIS SOLUTION BUT THIS DIDN'T WORK
    # if i % 20 == 0:
    #     canvas.showPage()

    data_actividades.append([hour_list[i],i,i])

    i += 1

    table_actividades = Table(data_actividades,colWidths=85,rowHeights=30,repeatRows=1)
    tblStyle = TableStyle([
        ('BACKGROUND',(0,0),(-1,title_background),('TEXTCOLOR',colors.whitesmoke),('ALIGN',(1,-1),'CENTER'),('GRID',1,colors.black)
    ])

    rowNumb = len(data_actividades)
    for row in range(1,rowNumb):
        if row % 2 == 0:
            table_background = colors.lightblue
        else:
            table_background = colors.aliceblue

        tblStyle.add('BACKGROUND',row),table_background)

    table_actividades.setStyle(tblStyle)

    width = 150
    height = 150
    table_actividades.wrapOn(canvas,width,height)
    table_actividades.drawOn(canvas,65,(0 - height) - 240)

canvas.save()

我尝试添加:

if i % 20 == 0:
    canvas.showPage()

然而这并没有达到预期的效果。

其他快速说明:尽管我专门对表格的列标题进行了编码。运行程序后,列标题的顺序因某种原因被修改(参见粘贴的图像)。知道为什么会这样吗?

data_actividades = [
    {'Hora',]

非常感谢您,祝您有美好的一天!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)