Creating Subreport within list in iReport

2019-02-19 08:05发布

问题:

I have a list of goals, each of which have another arraylist in it. I want to have the details in the child arraylist to be displayed using a subreport. I would like to have a subreport for each of the objects in the child arraylist.

The issue I am facing is that, I can't seem to find a way to specify the arraylist as data source for the subreport. When trying to create datasource, I can't select fields of the dataset on which the list is built, only the fields of the main report can be selected.

Is it possible to do this in iReport.? I am stuck with this for quite some time now. Any help is appreciated. :)

回答1:

With information given this would be the answer.

Main bean (your goals?), containing List of other bean (SubBean).

public class Bean {
  private String var1;
  private List<SubBean> subBeans;
  public String getVar1() {
    return var1;
  }
  public void setVar1(String var1) {
    this.var1 = var1;
  }
  public List<SubBean> getSubBeans() {
    return subBeans;
  }
  public void setSubBeans(List<SubBean> subBean) {
    this.subBeans = subBean;
  }
}

Sub bean

public class SubBean {
  private String var2;
  public SubBean(String var2){
    this.var2 = var2;
  }
  public String getVar2() {
    return var2;
  }
  public void setVar2(String var2) {
    this.var2 = var2;
  }
}

How to pass the SubBean List to a subreport.

  1. You need the field subBeans in you main report.

    <field name="subBeans" class="java.util.List"/>
    
  2. I suggest that you pass the location of the .jasper file as a parameter (Note jasper report needs absolute path) es. in main report

    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false"/>
    

and in java pass it (in example sub folder "jasper" in working directory is the location of the subreport.jasper)

paramMap.put("SUBREPORT_DIR", new File("jasper").getAbsolutePath() + File.separator);
  1. Now just call your subreport (needs to be complied into .jasper) from main report like this.

    <subreport>
      <reportElement x="105" y="4" width="400" height="100"/>
      <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subBeans})]]></dataSourceExpression>
      <subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression>
    </subreport>
    

Hence:

I'm creating a new JRDataSource for the sub report passing the List of SubBean in the current Bean

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subBeans})

indicating the absolute location of the compiled subreport.jasper

$P{SUBREPORT_DIR} + "subreport.jasper"

so now in your subreport you can use the field: var2 of the SubBean, just define it like this in the subreport.jrxml

<field name="var2" class="java.lang.String"/>