【问题标题】:Aligning Data in a ReportLab Table在 ReportLab 表中对齐数据
【发布时间】:2017-09-04 23:05:20
【问题描述】:

我想对齐 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)

但是,对齐标签没有对齐表格中的文本。如果对齐设置为左,也是如此。如何将单元格数据对齐到中心?

谢谢

【问题讨论】:

    标签: django reportlab


    【解决方案1】:

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

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

    提示:查看reportlab.platypus.tables.py中Table的实现

    更多提示:

    使用对齐符号:

    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)
    

    【讨论】:

    • 我确实浏览了 tables.py。我发现表格是用 0 样式实现的。我没有看到任何关于段落的内容。所以我尝试创建一种基于GetSampleStyleSheet() 的新型样式,但这也不起作用。你介意帮我多一点吗?我对 Django 很陌生。
    • 我试图更精确,我认为你应该实现自己的 StyleClass,在我的实现中,我只使用 GetSampleStyleSheet() 的结果没有成功
    猜你喜欢
    • 2021-06-14
    • 2016-09-23
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多