Python GeraldoReports - форматировать суммированное значение запятыми
Я использую Geraldo Reports для создания отчетов в формате PDF для моего проекта Django. Я застрял на том, как форматировать значения, которые являются суммарными значениями.
У меня есть ObjectValue с action=FIELD_ACTION_SUM
в группе отчетов. Я не могу понять, как отформатировать возвращаемое значение как число с запятыми, чтобы разделить тысячи.
Я попробовал аргумент get_text, который указан в документации Geraldo Reports, но не документирован как его использовать.
Мое текущее ObjectValue:
ObjectValue(
attribute_name='labor',
action=FIELD_ACTION_SUM,
left=7 * inch,
width=.8 * inch,
style={'alignment': TA_RIGHT},
get_text=lambda instance, value: '{:,.2f}'.format(value),
stores_text_in_cache=False
),
Мне не повезло в поисках решений. Кто-нибудь здесь знает, что я делаю неправильно, или что я должен делать вместо этого?
1 ответ
Я нашел ответ после долгих проб и ошибок! В моем примере у меня есть поле в наборе запросов с именем 'jd_gross', которое я хочу суммировать в своем отчете.... Я, наконец, отказался от раздела action=FIELD_ACTION_SUM и свернул свой собственный
в моем разделе band_detail я могу отобразить это поле запятыми со следующим:
ObjectValue(attribute_name='jd_gross', left=26.7*cm, width=1.7*cm, style={'alignment':TA_RIGHT}, get_value=lambda instance: intcomma(instance.jd_gross)),
Ответ, который мне подходит для сводного раздела, заключается в добавлении в раздел: def init(self, * args, ** kwargs): после: self.band_page_header.elements += [Я использовал ту же концепцию для расчета мой итог, преобразуйте его в отформатированную строку и добавьте строку в качестве поля системы в мой сводный раздел следующим образом:
myset = self.queryset
grosstotal = 0
for myline in myset:
if myline.jd_gross:
grosstotal += myline.jd_gross
ugrosstotal = intcomma(grosstotal)
self.band_summary.elements += [
SystemField(expression=ugrosstotal, top=1*cm, left=26.5*cm, width=1.9*cm, style={'alignment':TA_RIGHT}),
]
поэтому мой полный унаследованный отчет теперь выглядит следующим образом:
class JobdetailsReport (DefaultReport): title = 'Детали вакансии' page_size = ландшафт (A4)
class band_detail(DetailBand):
height=0.7*cm
elements=[
ObjectValue(attribute_name='jd_job', left=0.1*cm),
ObjectValue(attribute_name='c_name', left=1.5*cm),
ObjectValue(attribute_name='clientname', left=5.8*cm),
ObjectValue(attribute_name='jd_return', left=10.1*cm),
ObjectValue(attribute_name='jd_delivery', left=12.6*cm),
ObjectValue(attribute_name='get_j_status1_display', left=15.1*cm),
ObjectValue(attribute_name='get_j_status2_display', left=17.6*cm),
ObjectValue(attribute_name='jd_prodref', left=20.1*cm),
ObjectValue(attribute_name='userformalname', left=23*cm),
ObjectValue(attribute_name='jd_gross', left=26.7*cm, width=1.7*cm, style={'alignment':TA_RIGHT}, get_value=lambda instance: intcomma(instance.jd_gross)),
]
borders = {'bottom': True}
class band_summary(ReportBand):
height = 1.7*cm
elements = [
Label(text='Records printed:', top=1*cm, left=0.5*cm),
ObjectValue(expression='count(jd_job)', top=1*cm, left=5.6*cm),
Label(text="Total Value:", top=1*cm, left=22*cm),
]
borders = {'top': True}
def __init__(self, *args, **kwargs):
super(JobdetailsReport, self).__init__(*args, **kwargs)
self.band_page_header.elements += [
Label(text="Job No.", top=0.8*cm, left=0.1*cm),
Label(text="Client", top=0.8*cm, left=1.5*cm),
Label(text="Delivery", top=0.8*cm, left=5.8*cm),
Label(text="Return", top=0.8*cm, left=10.1*cm),
Label(text="Delivery", top=0.8*cm, left=12.6*cm),
Label(text="Physical Status", top=0.8*cm, left=15.1*cm),
Label(text="Accts Status", top=0.8*cm, left=17.6*cm),
Label(text="Reference", top=0.8*cm, left=20.1*cm),
Label(text="Our Contact", top=0.8*cm, left=23*cm),
Label(text="Gross", top=0.8*cm, left=27*cm),
]
myset = self.queryset
grosstotal = 0
for myline in myset:
if myline.jd_gross:
grosstotal += myline.jd_gross
ugrosstotal = intcomma(grosstotal)
self.band_summary.elements += [
SystemField(expression=ugrosstotal, top=1*cm, left=26.5*cm, width=1.9*cm, style={'alignment':TA_RIGHT}),
]
Надеюсь, что это поможет вам! Мне понадобилось несколько часов, чтобы заставить его работать......