Разделить таблицу ReportLab по странице PDF (рядом)? - PullRequest
1 голос
/ 21 февраля 2012

Приведенный ниже код создает хорошую тестовую таблицу с 99 строками данных и заголовком, который повторяется при каждом разрыве страницы.Таблица довольно узкая, поэтому я пытаюсь выяснить, как ее разбить так, чтобы в ней были строки 1-37 с левой стороны первой страницы, строки 38-74 с правой стороны первой страницы истроки 75-99 с левой стороны второй страницы.Я назвал это «разбивкой таблицы по странице», но, возможно, есть лучшее название того, что я пытаюсь сделать, поэтому я надеюсь, что описал это точно.

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Frame, Spacer
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.pagesizes import A3, A4, landscape, portrait
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfgen import canvas

pdfReportPages = "C:\\Temp\\test.pdf"
doc = SimpleDocTemplate(pdfReportPages, pagesize=A4)

# container for the "Flowable" objects
elements = []
styles=getSampleStyleSheet()
styleN = styles["Normal"]

# Make heading for each column and start data list
column1Heading = "COL ONE"
column2Heading = "COL TWO"
# Assemble data for each column using simple loop to append it into data list
data = [[column1Heading,column2Heading]]
for i in range(1,100):
    data.append(["Col 1 Row " + str(i),"Col 2 Row " + str(i)])

tableThatSplitsOverPages = Table(data, [2.5 * cm, 2.5 * cm], repeatRows=1)
tableThatSplitsOverPages.hAlign = 'LEFT'
tblStyle = TableStyle([('TEXTCOLOR',(0,0),(-1,-1),colors.black),
                       ('VALIGN',(0,0),(-1,-1),'TOP'),
                       ('LINEBELOW',(0,0),(-1,-1),1,colors.black),
                       ('BOX',(0,0),(-1,-1),1,colors.black),
                       ('BOX',(0,0),(0,-1),1,colors.black)])
tblStyle.add('BACKGROUND',(0,0),(1,0),colors.lightblue)
tblStyle.add('BACKGROUND',(0,1),(-1,-1),colors.white)
tableThatSplitsOverPages.setStyle(tblStyle)
elements.append(tableThatSplitsOverPages)

doc.build(elements)

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вам потребуется использовать PageTemplates для достижения этой цели путем создания PageTemplate, имеющего несколько фреймов, которые позволят вам указать области содержимого для рисования документа на странице. К сожалению, это означает отказ от SimpleDocTemplate и использование вместо него BaseDocTemplate и предоставление собственных PageTemplates (а также других вещей, если они вам нужны).

1 голос
/ 13 ноября 2018

Если вы знаете точное количество строк на странице, вы можете использовать эту функцию для имитации двух столбцов. Таким образом, таблица по-прежнему автоматически перемещается по нескольким страницам, и вам не нужно беспокоиться о шаблонах страниц.

def columnize(data, interval):
    ret = []
    for i in range(0, len(data), interval * 2):
        for j in range(min(interval, len(data) - i)):
            ret.append(data[i + j] + (data[i + j + interval] if i + j + interval < len(data) else []))
    return ret

Используйте в вашем примере:

data = columnize(data, 75)
tableThatSplitsOverPages = Table(data, [2.5 * cm, 2.5 * cm], repeatRows=1)
...