list - JasperReports列表+新页每条记录

标签 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>

所以我有一个包含 2 个对象的列表,即 beans。一切正常,但此测试变量在每个页面上显示两次(两个对象都在第一页上调用),而不是每页一个对象。我想在打印第一个测试后休息一下,以便列表中的下一个测试打印在下一页上。

有人能指出我正确的方向吗?

最佳答案

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

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

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

JasperReport jasperReport = null;
JasperPrint jasperPrint = null;

其中 ist 是 jrxml 的输入流,parameters 是 HashMap ,最后是 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 较小。 由于您在每一页上打印每个对象,因此如果页面数量多于对象,则显然有一个空白页,因此您将其删除。当然,您需要确保数据不会延伸到下一页,但我打印的页面始终看起来相同。

希望有帮助..

关于list - JasperReports列表+新页每条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19426740/

相关文章:

java - Jasper Reports PDF 不导出西里尔字母值

java - 使用jasperstarter编译运行iReport "java.lang.UnsupportedClassVersionError"

php - 分页的正确方法

html - 是否可以将我自己的 HTML 转换为 PDF,而不破坏页面,保留格式并支持超链接?

JAVA Arraylist 意外输出

list - Python - 如果元素与另一个元素相似,则从列表中删除该元素

PHP 按字母顺序排列

java - 迭代列表上编译失败

jasper-reports - 如何在 JasperReports 中转义特殊字符?

reporting-services - 在将 Reporting Services 报表导出到 Excel 时抑制分页符