JasperReports列表+新页面上的每条记录

2lo*_*rai 5 list jasper-reports page-break

我在JasperReports jrxml,详细信息部分中有以下报告.
这是我从Java获得的包含2个对象的列表,两个都在第一页上输出,因此每次调用测试变量.

<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>
Run Code Online (Sandbox Code Playgroud)

所以我有一个2个对象的列表,豆类.一切正常但这个测试变量在每个页面上显示两次(两个对象都在第一页上调用)而不是每页一个对象.我打算在第一次测试打印后休息,所以列表中的下一个测试打印在下一页.

谁能指出我正确的方向?

2lo*_*rai 2

我有答案,如果其他人也有同样的问题,我会将其发布在这里。

Jasper 的报告有很多问题。首先,当您打印出元素(对象)的集合时,您将集合发送到 jasper 引擎,由于某种未知的原因,该引擎无法识别集合中的第一个元素。您可以通过在集合的索引 0 上添加一个虚拟对象来解决此问题。

经过搜索我发现jasper API有getPages()函数。这将返回列表中将打印的页数。列表的每个索引都是一页。当您填写报告时,您可以从此 jasperPrint 调用此函数。

JasperReport jasperReport = null;
JasperPrint jasperPrint = null;
Run Code Online (Sandbox Code Playgroud)

其中 ist 是 jrxml 的输入流,parameters 是哈希图,最后是 jRBeancollData 源列表。

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

List<JRPrintPage> pages = japserPrint.getPages();
Run Code Online (Sandbox Code Playgroud)

有了这个 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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该函数仅删除最后一页,您可以对其进行修改,以便它删除任何其他空页(如果有),并且由于您放入了 1 个虚拟,因此 arraySize 较小。由于您在每一页上打印每个对象,因此如果页面数量多于对象,则显然有一个空白页,因此您将其删除。当然,您需要确保数据不会延伸到下一页,但我打印的页面总是看起来相同。

希望能帮助到你..