Reportlab: используйте Table и SPAN - PullRequest
1 голос
/ 01 ноября 2011

Пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.pagesizes import letter

def testPdf():
    doc = SimpleDocTemplate("testpdf.pdf",pagesize=letter,
                        rightMargin=72,leftMargin=72,
                        topMargin=72,bottomMargin=18)
    elements = []
    datas = []
    for x in range(1,50):
        datas.append(
            [x,x+1]
        )
    t=Table(datas)
    tTableStyle=[
        ('SPAN',(0,0),(0,37)),
      ]
    t.setStyle(TableStyle(tTableStyle))
    elements.append(t)
    doc.build(elements)

if __name__ == '__main__':
    testPdf()

этот код выполняется успешно, потому что таблица находится на одной странице, если я установлю «SPAN» на «(0,0), (0,38)»,ошибка:

reportlab.platypus.doctemplate.LayoutError: Переменная с ячейкой (0,0), содержащей
'1' (46.24 x 702), слишком большой на странице 2 во фрейме 'normal'(456,0 x 690,0 *) шаблона 'Later'

, и если я увеличу его значение, ошибка будет:

Traceback (most recent call last):
  File "testpdf.py", line 26, in <module>
    testPdf()
  File "testpdf.py", line 23, in testPdf
    doc.build(elements)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 1117, in build
    BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 880, in build
    self.handle_flowable(flowables)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/doctemplate.py", line 763, in handle_flowable
    if frame.add(f, canv, trySplit=self.allowSplitting):
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/frames.py", line 159, in _add
    w, h = flowable.wrap(aW, h)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/tables.py", line 1113, in wrap
    self._calc(availWidth, availHeight)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/tables.py", line 587, in _calc
    self._calc_height(availHeight,availWidth,W=W)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/tables.py", line 553, in _calc_height
    spanFixDim(H0,H,spanCons,lim=hmax)
  File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/platypus/tables.py", line 205, in spanFixDim
    t = sum([V[x]+M.get(x,0) for x in xrange(x0,x1)])
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Как с этим справиться?

1 Ответ

2 голосов
/ 25 апреля 2012

Причина, по которой вы сталкиваетесь с этой проблемой, заключается в том, что Гордон Уорли прокомментировал выше. Невозможно автоматически перемещаться по странице, поскольку реализованный алгоритм будет путать с высотой и шириной.

Подход к решению этой проблемы будет вручную форматировать / стилизовать вашу таблицу на странице, используя координаты строки / столбца. К сожалению, даже ответы в отчете показывают, что мы делаем это вручную.

Я разделил свои таблицы вручную и создал их отдельно, что, на мой взгляд, очень уродливый подход. Я поищу другие альтернативы позже.

Для справки: https://bitbucket.org/ntj/reportlab_imko_table

...