Как изменить размер столбца в соответствии с содержимым в ReportLab?

Я работаю на питоне, используя ReportLab. Мне нужно создать отчет в формате PDF. Данные извлекаются из базы данных и вставляются в таблицу. Вот простой код:

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.units import inch
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []

data= [['00', '01', '02', '03', '04'],
       ['10', 'Here is large field retrieve from database', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', 'Here is second value', '34']]
t=Table(data)
columnWidth = 1.9*inch;
for x in range(5):
        t._argW[x]= cellWidth
elements.append(t)
doc.build(elements)

Есть три проблемы:

  1. Длинные данные в ячейке перекрываются с другой ячейкой в ​​строке.
  2. Когда я увеличиваю ширину столбца вручную, например cellWidth = 2.9*inch; , страница не видна и не прокручивается слева направо
  3. Я не знаю, как добавить данные в ячейку, значит, если размер данных большой, он должен добавляться к следующей строке в той же ячейке.

Как я достигаю этой проблемы?


person Zeb    schedule 19.03.2014    source источник


Ответы (2)


Для начала я бы не стал устанавливать размер столбца, как вы. просто передайте Table аргумент colWidths следующим образом:

Table(data, colWidths=[1.9*inch] * 5)

Теперь к вашей проблеме. Если вы не установите параметр colWidth, reportlab сделает это за вас и разместит столбцы в соответствии с вашими данными. Если это не то, что вам нужно, вы можете инкапсулировать свои данные в Paragraph, как сказал Бертран. Вот модифицированный пример вашего кода:

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
styles = getSampleStyleSheet()
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []

data= [['00', '01', '02', '03', '04'],
       ['10', Paragraph('Here is large field retrieve from database', styles['Normal']), '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', 'Here is second value', '34']]
t=Table(data)
elements.append(t)
doc.build(elements)

Я думаю, вы получите идею.

person Fookatchu    schedule 20.03.2014

Привет, у меня возникла такая же проблема, когда я изменял размер содержимого таблицы, а затем нашел решение. Это решение может помочь вам и решить все ваши 3 проблемы, которые упоминаются здесь.

from reportlab.lib import colors
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib.units import inch
doc = SimpleDocTemplate("simple_table.pdf", pagesize=letter)
elements = []

data= [['00', '01', '02', '03', '04'],
       ['10', 'Here is large field retrieve from database', '12', '13', '14'],
       ['20', '21', '22', '23', '24'],
       ['30', '31', '32', 'Here is second value', '34']]
t=Table(data,colWidths=[1.9*inch]*5, rowHeights=[0.9*inch] *4)
#colWidth = size * number of columns
#rowHeights= size * number of rows
elements.append(t)
doc.build(elements)
person Royal Patel    schedule 06.12.2020