4

JasperReports では、 current-page / total-pagesのスタイルでページ番号をレンダリングするのが好きです。公式のデモを調べると、3つを使用して次の解決策を見つけることができます(ページ数のTextFields組み込み変数がないため)

<!-- Right aligned current page -->
<textField>
    <reportElement x="100" width="40" .../>
    <textElement textAlignment="Right" ... />
    <textFieldExpression class="java.lang.String">
        <![CDATA[String.valueOf($V{PAGE_NUMBER})]]>
    </textFieldExpression>
</textField>

<!-- Centered aligned slash -->
<staticText>
    <reportElement x="140" width="5" .../>
    <textElement textAlignment="Center" ... />
    <text>
        <![CDATA[/]]>
    </text>
</staticText>

<!-- Left aligned total number pages (evaluationTime="Reports") -->
<textField evaluationTime="Report">
    <reportElement x="145" width="40"/>
    <textElement textAlignment="Left" ... />
    <textFieldExpression class="java.lang.String">
        <![CDATA[String.valueOf($V{PAGE_NUMBER})]]>
    </textFieldExpression>
</textField>

ただし、これは完全なページング情報がページに対して中央に配置されている場合 (中央にスラッシュがある場合) にのみ正常に機能します。私が達成したいのは、合計ページが右の境界線から一定の距離になるように、グループ全体を右揃えにすることです。

これを達成する方法は?

4

2 に答える 2

4

一見難しそうな問題です。この主張をより正確に説明しようとすると、「ページ数の組み込み変数はない」という重要な問題が明らかになります。すべての変数には評価時間があります。したがって、変数$V{PAGE_NUMBER}は実際にはページ数の組み込み変数です...ただし、レポート時に評価される場合のみです。

したがって、Total Pages フィールドは で評価する必要がありますReport Time

同様に、まったく同じ変数$V{PAGE_NUMBER}は、実際には現在のページ番号の組み込み変数ですが、NowまたはPage(または他の適切な時間) に評価される場合のみです。

したがって、現在のページ フィールドを評価する必要がありNowますPage

したがって、これらの変数は異なるテキスト フィールドにある必要があるため、異なるタイミングで評価することができます。

しかし、これはあなたの要件と矛盾します。これらを同じテキスト フィールドに入れることはできないため、一番右の項目を右揃えにして、その左にある項目を完全にそこに流し込むことはできません。

正確な状況によっては、許容できる回避策を達成できる場合があります。しかし、私の推測では、回避策に必要な労力が多すぎると思います。たとえば、レポートの入力が完了した後に実行されるスクリプトレットを想像できます。レポートを解析して「Page 3 of xxx」フィールドを見つけ、xxx を正しい合計に置き換えることができます。これがどのように機能するかは正確にはわかりません。それはほとんど悪いニュースのように聞こえます。お勧めしません。

または、総ページ数を何らかの方法で外部的に計算し、これをパラメーターとしてレポートに渡すこともできます。たとえば、ページ数が行数に直接依存する場合に機能します。しかし、これは非常に特別に定義された場合にのみ機能します。ハックです。

強化リクエストは確実にログに記録する必要があります。魔法の時間に評価されるテキストフィールドに配置されたときに、あなたが望むことをする特別な変数を想像することができますAuto。しかし、今のところ、あなたが望むものを手に入れる簡単な方法はありません。

于 2012-04-18T18:23:02.760 に答える
2

http://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=68429で解決策を見つけました。

秘密はevalutionTime="Auto"、テキスト フィールドで定義することのようですPage {X} of {Y}

これが私にとってどのように機能したかです(これもhttp://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=68429の功績です)

最初に変数を定義しますCURRENT_PAGE_NUMBER

Variable class: java.lang.Integer
Calculation: Nothing
Reset type: Page
Variable Expression: $V{PAGE_NUMBER}

これは単にページ番号をコピーします。(興味深いことに、フォーラムの投稿では、詳細バンドReset type: Noneに表示したい場合にはどちらが機能するかを設定する必要Page {X} of {Y}がありますが、ページヘッダーバンドに表示したい場合は機能しません.)

この後、必要な場所にテキスト フィールドを配置する必要があります。Page {X} of {Y}私の場合は、ページ ヘッダーの右側に式を入力します。

msg("Page {0} of {1}", $V{CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER})  

そしてセット

evaluationTime="Auto"

1 つのテキスト フィールドに現在のページ数と合計ページ数の両方が表示されるようになったので、好きなように簡単に配置できます。

于 2012-08-01T14:45:12.070 に答える