2012-04-17 15 views
3

JasperReportsでは、スタイル番号の現在のページ/合計ページのページ番号をレンダリングしたいと思います。公式のデモを学ぶ 次の3つがTextFields完全なページング情報がJasperReportsの右揃えページ番号情報

<!-- 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> 

はしかし、これが唯一正常に動作します(組み込み変数 ページの数のために何がされているため)であるとき、使用していない、次の解決策を見つけることができます(中央のスラッシュを使用して)ページを中心にします。 私が達成したいのは、合計ページが右のボーダーまで一定の距離を持つように、グループ全体を右揃えにすることです。

これを行うには?

+0

単一のテキストフィールドを使用して[Show "Page X of Y"を表示](http://stackoverflow.com/questions/10673263/show-page-x-of-y-using-a-single-text -field) –

答えて

3

これは最初に思われるより難しい問題です。重要な問題は、「ページ数の組み込み変数がありません」というこの主張についてより正確にしようとすると明らかになります。すべての変数に評価時間があります。変数$V{PAGE_NUMBER}は実際にはページ数の組み込み変数ですが、レポート時に評価された場合に限ります。

したがって、合計ページのフィールドは、Report Timeで評価する必要があります。

は同様に、非常に同じ変数$V{PAGE_NUMBER}は本当に現在のページ番号のためのビルトイン変数です...しかしNowまたはPage(または他の適切な時点)で評価する場合にのみ。

したがって、現在のページフィールドはNowまたはPageと評価されなければなりません。

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

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

状況によっては、適切な回避策を達成できる可能性があります。しかし、私の推測では、回避策に関わる努力は高すぎるだろうということです。たとえば、レポートの作成が完了した後に実行されるスクリプトレットを想像することができます。レポートを解析して、 "Page 3 of xxx"フィールドを探し、xxxを正しい合計に置き換えることができます。私はこれがどのように機能するか正確にはわかりません。それはほとんどが悪いニュースのように聞こえる。私はそれをお勧めしません。

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

エンハンスメントリクエストを確実に記録する必要があります。私は魔法の時に評価するテキストフィールドに置いたときにあなたが望むことをする特別な変数を想像することができますAuto。しかし今のところ私はあなたが望むものを手に入れるための簡単な方法は見当たりません。

+0

あなたの答えをありがとう。おそらく、拡張レポートを提出することをお勧めします。さらに、JasperReportsに依存するDynamicReports(http://dynamicreports.sourceforge.net)プロジェクトには、pageXofY()APIメソッドがあることも認識しました。私はそれが正確に何かをチェックするつもりです。 DynamicReportsによってアセンブルされたJasperReport xmlスニペットの混合物を使用しているので、このライブラリを使用しています。これはオプションです。 – rainer198

+0

DynamicReportsで成功した場合は、ここで言及してください。実際には... DynamicReportsのYの右寄せページXで成功していない場合は、ここでも言及してください。 – mdahlman

2

解決策はhttp://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=68429です。

秘密は、テキストフィールドPage {X} of {Y}evalutionTime="Auto"を定義しているようです。

ここでは、(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} 

を定義します。 (興味深いことにフォーラムのポストは1つがあなたが詳細バンドでPage {X} of {Y}を表示したい場合には動作しますが、あなたが私はそれがページのヘッダーバンドに示すことにしたいような場合は動作しませんReset type: Noneを設定するべきであると述べた。)この後

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

、あなたが今持っているので

evaluationTime="Auto" 

を設定します。私の場合には、ページヘッダーの右側に、式を入力します - あなたはあなたのPage {X} of {Y}になりたいテキストフィールドを配置する必要があります1つのテキストフィールド内の現在のページ数と総ページ数の両方を、好きな方法で簡単に並べ替えることができます。

+0

この方法は私のためには機能しませんでした。私は2ページのレポートを持っており、最初のページは「ページ1/2」を正しくレンダリングします。しかし、2番目のページには「Page null of 2」があるため、ここでは何か問題があります。 –

+0

は1ページのみで動作します – ununiform

+0

これは10ページのレポートで完璧に動作します。 –