5

JasperReports jrxml の詳細セクションに次のレポートがあります。これは、2 つのオブジェクトを含むJava
から取得したリストです。どちらも最初のページに出力されるため、テスト変数が呼び出されるたびに呼び出されます。

<detail>
    <band height="200" splitType="Stretch">
        <componentElement>
            <reportElement key="table" style="table" x="0" y="49" width="500" height="140"/>

            <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                <datasetRun subDataset="Data Set">
                    <datasetParameter name="REPORT_DATA_SOURCE">
                        <datasetParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></datasetParameterExpression>
                    </datasetParameter>
                </datasetRun>
                <jr:listContents height="50" >
                    <textField  isBlankWhenNull="true">
                        <reportElement x="0" y="0" width="200" height="20" isRemoveLineWhenBlank="true"/>
                        <textElement textAlignment="Left" verticalAlignment="Middle" >
                            <font size="10" fontName="DejaVu Serif" isBold='true'/>
                        </textElement>
                        <textFieldExpression><![CDATA[$F{test}]]></textFieldExpression>
                    </textField>
                </jr:listContents>
            </jr:list>
        </componentElement>
    </band>
</detail>

だから私は2つのオブジェクト、豆のリストを持っています。すべてが機能しますが、このテスト変数は、ページごとに 1 つのオブジェクトではなく、各ページに 2 回表示されます (両方のオブジェクトが最初のページで呼び出されます)。最初のテストが印刷された後に休憩を入れたいので、リストの次のテストは次のページに印刷されます。

誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

2

私は答えを持っています。他の誰かが同じ問題を抱えている場合は、ここに投稿します。

Jasper レポートは非​​常にバグがあります。まず、要素 (オブジェクト) のコレクションを出力するときに、コレクションを jasper エンジンに送信しますが、何らかの理由でコレクションの最初の要素を認識しません。これを解決するには、コレクションのインデックス 0 にダミー オブジェクトを 1 つ追加します。

検索した後、jasper API に関数 getPages() があることがわかりました。これは、印刷されるページ数をリストで返します。リストの各インデックスは 1 ページです。レポートに入力するときに、この jasperPrint からこの関数を呼び出すことができます。

JasperReport jasperReport = null;
JasperPrint jasperPrint = null;

ここで、ist は jrxml の入力ストリーム、parameters はハッシュマップ、last は jRBeancollData ソースのリストです。

beanColDataSource = new JRBeanCollectionDataSource("YOURLIST");
jasperReport = JasperCompileManager.compileReport(ist);
jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);

List<JRPrintPage> pages = japserPrint.getPages();

このjasperPrintを取得したら、私が書いたこの関数を呼び出すことができます。

 /**
         * This removes blank page if the page size is bigger then the number of
         * "pages" in array if for some reason we get last page as empty in pdf - we
         * also put arraySize - 1 since we ve put one dummy(empty) in the array
         * collection on index 0 since for some buggy unknown reason jasper always
         * outputs collections from index 1 forward instead of 0.
         * 
         * @author Uros
         * @param pages
         *            , arraySize
         */
        private void removeBlankPage(List<JRPrintPage> pages, int arraySize)
        {
            int numOfPages = pages.size();

            if (numOfPages > arraySize - 1)
            {
                pages.remove(numOfPages - 1);
            }
        }

この場合の関数は最後のページのみを削除します。他の空のページがあればそれを削除するように変更できます。1 つのダミーを配置したため、arraySize は 1 だけ小さくなります。各オブジェクトを各ページに印刷するため、オブジェクトよりも多くのページがある場合、空のページが 1 つあることが明らかなので、それを削除します。もちろん、データが次のページに広がっていないことを確認する必要がありますが、常に同じように見えるページを印刷します。

それが役に立てば幸い..

于 2013-10-18T12:32:08.163 に答える
0

私は iReport でレポートをデザインしています。これにより、改ページを詳細バンドにドラッグ アンド ドロップできますが、これが役立つかもしれません。結果の XML は次のようになります。

          <break>
               <reportElement uuid="*uuid here*" x="0" y="28" width="100" height="1"/>
          </break>
     </band>
</detail>

詳細バンドの下部に私のものを挿入したので<break>、2 つのオブジェクトの間に挿入してみてください。

于 2013-10-17T15:00:33.213 に答える
0

はい、最初のオブジェクトを印刷した後に改ページ パレットを配置します。両方のオブジェクトを異なるページに印刷するようにします。

于 2013-10-17T15:03:23.200 に答える
0

サブレポートを使用します。リストを JRBeanCollectionDataSource として SubReport にフィードします。そのサブレポートをサブレポートのすぐ下の改ページと共に詳細バンドに配置します。

              <break>
                   <reportElement uuid="*uuid here*" x="0" y="28" width="100" height="1"/>
              </break>
于 2015-01-16T13:29:39.793 に答える