当子报表达到条件使用 Java时,如何对主 Jasper 报表进行分页?

问题描述

我想知道当子报表达到特定条件时如何在主报表中进行分页。 所有数据都来自 Java 代码中的集合。我想要的结果是(示例):

  1. 子报表有 2 个字段:“nome”和“idade”;
  2. 用idade小于5的人的数据填写子报表;
  3. 如果有 idade 等于或大于 5 的人,则在主报告处进行分页,并用这些人的数据填充子报告;
  4. 标题必须在每一页重复。

到目前为止,我的进度是列出所有没有过滤器的人。

我使用的是 Jaspersoft Studio 6.10.0 版和 JDK 8。

主报告JRXML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="master_report" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="cd7e30b6-06b9-4357-ae80-337e2283a0a8">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="pessoas" class="java.util.List"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="170" y="24" width="430" height="30" uuid="1bf251d7-e6ff-4da3-9dbe-921a8ed657ab"/>
                <textElement textAlignment="Center">
                    <font size="20"/>
                </textElement>
                <text><![CDATA[Jasper Reports People Fill]]></text>
            </staticText>
        </band>
    </title>
    <detail>
        <band height="57" splitType="Stretch">
            <subreport>
                <reportElement x="0" y="0" width="802" height="34" uuid="2669b472-dcd5-4ec9-bbc9-7f900e08dbe5"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{pessoas})]]></dataSourceExpression>
                <subreportExpression><![CDATA["reports/subreport.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

子报表:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="subreport" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="98cc3add-3118-40e8-859c-5e0264ae9fe8">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="nome" class="java.lang.String"/>
    <field name="idade" class="java.lang.String"/>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="61" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="401" height="30" uuid="cd2eb0f5-9846-4717-b073-8de4ed07a4a8"/>
                <textFieldExpression><![CDATA[$F{nome}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="401" y="0" width="401" height="30" uuid="537035d0-88c6-425e-b28d-41a598de2b29"/>
                <textFieldExpression><![CDATA[$F{idade}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

Java 主代码示例:

package org.example.subreport;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import org.example.subreport.domain.Pessoa;

import java.io.File;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        try {
            JasperCompileManager.compileReportToFile(
                    "reports/master_report.jrxml","reports/master_report.jasper");

            JasperReport masterReport = (JasperReport) JRLoader.loadObject(new File("reports/master_report.jasper"));

            JRBeanCollectionDataSource pessoasCol = new JRBeanCollectionDataSource(Collections.singletonList(""));

            // The parameter "pessoas" will be shared with the subreport
            Map<String,Object> pessoas = new HashMap<>();
            pessoas.put("pessoas",getListaPessoasParaSubreport());

            JasperPrint jasperPrintPDF = JasperFillManager.fillReport(masterReport,pessoas,pessoasCol);

            JasperExportManager.exportReportToPdfFile(jasperPrintPDF,"reports/master" + ".pdf");
        } catch (JRException e) {
            e.printStackTrace();
        }
    }

    public static List<Pessoa> getListaPessoasParaSubreport()  {
        Pessoa john = new Pessoa ("John","23");
        Pessoa maria = new Pessoa ("Maria","40");
        Pessoa peter = new Pessoa ("Peter","4");
        Pessoa annie = new Pessoa ("Annie","1");

        return Arrays.asList(john,maria,peter,annie);
    }

}

佩索阿课程:

package org.example.subreport.domain;

public class Pessoa {

    private String nome;
    private String idade;

    public Pessoa() {
    }

    public Pessoa(String nome,String idade) {
        this.nome = nome;
        this.idade = idade;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getIdade() {
        return idade;
    }

    public void setIdade(String idade) {
        this.idade = idade;
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...