在 ReportLab 中对齐数据 Table
Aligning Data in a ReportLab Table
我想在 ReportLab table 中对齐数据,以便 table 的一半向左对齐,table 的一半向右对齐。这个table是由段落和变量组成的。这是代码:
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)
但是,对齐标签并未对齐 table 中的文本。如果将对齐设置为左对齐,也是如此。如何将我的单元格数据对齐到中心?
谢谢
您的段落是否可能覆盖 TableStyle 设置的对齐方式?请注意,您使用的样式 ['Heading1'] 有自己的对齐方式...
a Paragraph 继承了 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')
在 table 中使用 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)
我想在 ReportLab table 中对齐数据,以便 table 的一半向左对齐,table 的一半向右对齐。这个table是由段落和变量组成的。这是代码:
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)
但是,对齐标签并未对齐 table 中的文本。如果将对齐设置为左对齐,也是如此。如何将我的单元格数据对齐到中心?
谢谢
您的段落是否可能覆盖 TableStyle 设置的对齐方式?请注意,您使用的样式 ['Heading1'] 有自己的对齐方式...
a Paragraph 继承了 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')
在 table 中使用 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)