1

Geraldo Reportsを使用して、DjangoプロジェクトのPDFレポートを作成しています。要約値である値をフォーマットする方法に固執しています。レポートグループに
ObjectValueがあります。action=FIELD_ACTION_SUM戻り値をカンマ付きの数値としてフォーマットして数千を区切る方法がわかりません。

Geraldo Reportsのドキュメントにリストされているget_text引数を試しましたが、その使用方法については十分にドキュメント化されていません。

私の現在の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
),

私は解決策を探す運がありませんでした。ここの誰かが私が間違っていること、または代わりに私が何をすべきかを知っていますか?

4

1 に答える 1

2

何度も試行錯誤して答えを見つけました!私の例では、レポートに合計したい「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)),

ただし、要約セクションで有効な答えは、:self.band_page_header.elements + = [の後に:def init(self、* args、** kwargs):セクションを追加することです。同じ概念を使用して計算しました。私の合計、それをフォーマットされた文字列に変換し、次のように私の要約セクションにシステムフィールドとして行を追加します:

    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=landscape(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}),
        ]

それがあなたを助けることを願っています!それが機能するのに数時間しかかかりませんでした......

于 2013-08-15T20:26:41.413 に答える