Search code examples
javajasper-reports

JRBeanCollectionDataSource: How to show data from the java.util.List from JavaBean?


My JavaBean contains the java.util.List.

Userinfo {
    private String username;
    private String password;
    List<Address> listAddress;
}

How to show the data of this List in the Detail band?


Solution

  • Here is the working sample.

    The key points of this sample:

    • using of the _THIS expression;
    • using List (jr:list) component in Detail band

    The snippet of code for generating report:

    public static void testBuildPdf() {
        try {
            Map<String, Object> params = new HashMap<String, Object>();
            JasperReport jasperReport = JasperCompileManager.compileReport(reportSource);
            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDataSource());
    
            JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private static JRDataSource getDataSource() {
        Collection<BeanWithList> coll = new ArrayList<BeanWithList>();
        coll.add(new BeanWithList(Arrays.asList("London", "Paris"), 1));
        coll.add(new BeanWithList(Arrays.asList("London", "Madrid", "Moscow"), 2));
        coll.add(new BeanWithList(Arrays.asList("Rome"), 3));
    
        return new JRBeanCollectionDataSource(coll);
    }
    

    The JavaBean code:

    public class BeanWithList {
    
        // The member's name can be any. The JR engine is using public getter for extracting field's value
        private List<String> cities;
        private Integer id;
    
        public BeanWithList(List<String> cities, Integer id) {
            this.cities = cities;
            this.id = id;
        }
    
        // getter should be public    
        public List<String> getCities() {
            return this.cities;
        }
    
        public Integer getId() {
            return this.id;
        }
    }
    

    The jrxml file:

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport ...>
        <subDataset name="dataset1">
            <field name="city" class="java.lang.String">
                <fieldDescription><![CDATA[_THIS]]></fieldDescription>
            </field>
        </subDataset>
        <field name="id" class="java.lang.Integer"/>
        <field name="cities" class="java.util.Collection"/>
        <title>
            <band height="103" splitType="Stretch">
                <staticText>
                    <reportElement x="138" y="28" width="258" height="20"/>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true" isItalic="true"/>
                    </textElement>
                    <text><![CDATA[Bean with List sample]]></text>
                </staticText>
            </band>
        </title>
        <columnHeader>
            <band height="20">
                <staticText>
                    <reportElement x="0" y="0" width="100" height="20"/>
                    <box>
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true" isItalic="true" isUnderline="false"/>
                    </textElement>
                    <text><![CDATA[Id]]></text>
                </staticText>
                <staticText>
                    <reportElement x="100" y="0" width="100" height="20"/>
                    <box>
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement textAlignment="Center" verticalAlignment="Middle">
                        <font isBold="true" isItalic="true" isUnderline="false"/>
                    </textElement>
                    <text><![CDATA[City name]]></text>
                </staticText>
            </band>
        </columnHeader>
        <detail>
            <band height="20" splitType="Stretch">
                <textField>
                    <reportElement stretchType="RelativeToTallestObject" x="0" y="0" width="100" height="20"/>
                    <box leftPadding="10">
                        <topPen lineWidth="1.0"/>
                        <leftPen lineWidth="1.0"/>
                        <bottomPen lineWidth="1.0"/>
                        <rightPen lineWidth="1.0"/>
                    </box>
                    <textElement/>
                    <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
                </textField>
                <componentElement>
                    <reportElement x="100" y="0" width="400" height="20"/>
                    <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" printOrder="Vertical">
                        <datasetRun subDataset="dataset1">
                            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{cities})]]></dataSourceExpression>
                        </datasetRun>
                        <jr:listContents height="20" width="400">
                            <textField>
                                <reportElement x="0" y="0" width="100" height="20"/>
                                <box leftPadding="10">
                                    <topPen lineWidth="1.0"/>
                                    <leftPen lineWidth="1.0"/>
                                    <bottomPen lineWidth="1.0"/>
                                    <rightPen lineWidth="1.0"/>
                                </box>
                                <textElement/>
                                <textFieldExpression><![CDATA[$F{city}]]></textFieldExpression>
                            </textField>
                        </jr:listContents>
                    </jr:list>
                </componentElement>
            </band>
        </detail>
    </jasperReport>
    

    The result will be:

    The resulting report in PDF format


    Other related questions are the How do I print a list of strings contained within another list in iReport? question and Passing the List of primitive type objects as datasource for subreport question.