2017-01-23 63 views
1

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

但是,align标签未对齐表格中的文本。如果对齐方式设置为左侧,则同样如此。我怎样才能将我的细胞数据与中心对齐?

谢谢

回答

0

是否有可能您的段落覆盖由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') 

在表格中使用段落和段落样式是一种很好的做法。 您可以使用pdfmetrics模块计算宽度:

from reportlab.pdfbase.pdfmetrics import stringWidth, getFont 

或通过内置的功能:

para=Paragraph(text,sty) 

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

所有的可流动应该有一个名为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) 
+0

我看过tables.py。我发现这些表是用0样式实现的。虽然我没有看到关于段落的任何内容。所以我试图创建一个基于'GetSampleStyleSheet()'的新类型的样式,但这也不起作用。你介意多帮我一把吗?我对Django很新颖。 – GreenSaber

+0

我试图做得更精确,我认为你应该实现你自己的StyleClass,在我的实现中,我只使用GetSampleStyleSheet()的结果没有成功, – skidzo