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?
12 Answers
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:
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.
7public void generisiIzvestaj(HttpServletRequest request, HttpServletResponse response) throws Exception { List<Predstava> predstave = (List<Predstava>)request.getSession().getAttribute("predstaveR"); JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(predstave); InputStream inputStream = this.getClass().getResourceAsStream("/reports/Predstave.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(inputStream); Map<String, Object> params = new HashMap<String, Object>(); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource); inputStream.close(); response.setContentType("application/x-download"); response.addHeader("Content-disposition", "attachment; filename=PredstaveRezisera.pdf"); ServletOutputStream out = response.getOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint,out);
ncG1vNJzZmirpJawrLvVnqmfpJ%2Bse6S7zGiorp2jqbawutJoaGtqYG6AcXyOo6mbnZGjsLC4y56araGfo7GiwMCspq6qk5p6qbvWZquoZaOdvLh5w5qrmmWWp7yuedOhnGaikauubsHToqNmpJmowW6y0aikZqKRq66jsQ%3D%3D