在ReportLab表

时间:2017-01-23 15:30:38

标签: django reportlab

我想在ReportLab表中对齐数据,以使表的一半与左对齐,并且一半表与右对齐。该表由段落和变量组成。这是代码:

table_data = []
quote_title = Paragraph(qn, styles['Heading1'])
table_data.append([ttab_empty, quote_title, ttab_empty]) #tab_empy are empty strings
title_table = Table(table_data, colWidths=[5 * cm, 5 * cm, 5 * cm])
title_table.setStyle(TableStyle([('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
    ('ALIGN', (0, 0), (-1, -1), "CENTER")]))
elements.append(title_table)

但是,对齐标记不对齐表格中的文本。如果对齐设置为左,则相同。如何将细胞数据与中心对齐?

由于

1 个答案:

答案 0 :(得分:0)

你的Paragraph是否可以覆盖TableStyle设置的对齐方式?请注意,您使用的样式['Heading1']具有自己的对齐...

段落继承了reportlab.platypus.Flowable并将在构建时绘制自己。

提示:请参阅reportlab.platypus.tables.py

中表的实现

更多提示:

使用对齐符号:

from reportlab.lib.enums import TA_JUSTIFY,TA_LEFT,TA_CENTER,TA_RIGHT

和自定义字体名称:

_baseFontName  ='Helvetica'
_baseFontNameB ='Helvetica-Bold'
_baseFontNameI ='Helvetica-Oblique'
_baseFontNameBI='Helvetica-BoldOblique'

尝试使用:

sty= ParagraphStyle(name='Heading1',
                    parent=self.stylesheet['Normal'],
                    fontName = _baseFontNameB,
                    fontSize=18,
                    leading=22,
                    spaceAfter=6,
                    alignment=TA_CENTER)
                    alias='h1')

最好在表格中使用Paragraphs和ParagraphStyle。 您可以使用pdfmetrics模块计算宽度:

from reportlab.pdfbase.pdfmetrics import stringWidth, getFont

或内置函数:

para=Paragraph(text,sty)

para.minWidth()
print(para.__repr__())

所有Flowable都应该有一个名为minWidth()的函数,这就是你可以使用的原因:

if isinstance(obj,Flowable):
    return obj.minWidth()

最后::

from reportlab.lib.enums import TA_JUSTIFY,TA_LEFT,TA_CENTER,TA_RIGHT
from reportlab.pdfbase.pdfmetrics import stringWidth, getFont

_baseFontName  ='Helvetica'
_baseFontNameB ='Helvetica-Bold'
_baseFontNameI ='Helvetica-Oblique'
_baseFontNameBI='Helvetica-BoldOblique'

from reportlab.platypus import Paragraph, Table, TableStyle, SimpleDocTemplate

from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib import colors
from reportlab.lib.units import inch, cm, mm

styles = getSampleStyleSheet()
qn = "some title"

doc = SimpleDocTemplate("test.pdf")

elements = []

ttab_empty = ""
table_data = []


print(vars(styles['Heading1']))

# that's why you should use your own paragraph style:
sty = ParagraphStyle(name='Heading1',
                     parent=styles['Normal'],
                     fontName = _baseFontNameB,
                     fontSize=18,
                     leading=22,
                     spaceAfter=6,
                     alignment=TA_CENTER)


quote_title = Paragraph(qn, sty)

table_data.append([ttab_empty, quote_title, ttab_empty]) #tab_empy are empty strings
title_table = Table(table_data, colWidths=[5 * cm, 5 * cm, 5 * cm])
title_table.setStyle(TableStyle([('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
    ('ALIGN', (0, 0), (-1, -1), "CENTER")]))
elements.append(title_table)

doc.multiBuild(elements)