Java – Print an arraylist content with JasperReports

jasper-reportsjava

I want to print the content of an ArrayList using JasperReports in Java

Actually I am know little about Jasper Reporting
I use iReport to create Japser Reports and using Java command I will print it.

Now I want to print the student results using JasperReports.
This is my sample results table.

Reg.No  SubjectCode  Level  Semester  Grade  Marks
132108  CMIS 1113    1        1        A      77
132107  CMIS 1213    1        2        C      57
122101  IMGT 2112    2        1        A      87
122110  IMGT 2213    2        2        A      83
112123  STAT 3113    3        1        C      55
112135  MATH 3213    3        2        B      67
132145  CMIS 1113    1        1        D      17
122118  ELTN 2213    1        2        A      90
112100  CMIS 3213    3        2        A      89
112117  SATA 3113    1        1        A      87
122104  CMIS 2213    2        2        C      54
132104  CMIS 1213    1        2        A      84

So according to my above table I need to print "Results of student in particular level in particular semester".

In my interface I have facility to select the Level and the Semester.
Then the relevant query with generate automatically and results will obtain from the database and using Results object(I create class called 'Results' to store the results of a particular student) I add the results data to a ArrayList.
Now my ArrayList have the Results objects which carries the results of each students in particular level and particular semester.Now I want to print this ArrayList using Jasper report.So expected Jasper Report is like this.
For Level 1 and Semester 1,

Reg.No  CMIS1113   
132108    A
132145    D

For Level 2 and Semester 2,

Reg.No  IMGT2213  CMIS2213   
122110    A          -
122104    -          C

Now I have several problems.

1) Normally what I did previously is when I create Jasper Template using iReport I gave the relevant query before creating it.But here query will be changed according to selected Level and Semester.So the result will be changed according to the query.And column headers also changed because subjects are changing.(Number of subject are not similar in each semester and each level)So my question is how can I create a common Jasper Templates to Handle each situation?(if possible)

2) How I print the ArrayList using Java code.I do not know the java code to print the content of ArrayList using Jasper Report.

I know very few things about Jasper Reports.So if you can please help me.Thank You.

Best Answer

you can pass the ArrayList to report as a parameter. Then in Report create a Subdataset with the same parameter name and type (ArrayList). Then Create a table component. use the ConnectionExpression:

new net.sf.jasperreports.engine.JREmptyDataSource($P{IN_ARRAY_LIST}.size())

Then map report parameter to table parameter. Then in TextFields in the table component you can use the expression like that:

$P{IN_ARRAY_LIST}.get($V{REPORT_COUNT})

Make sure that EvaluationTime property of your TextFields is set to now.

UPD: Short demo report which shows how ArrayList source works:

<?xml version="1.0" encoding="UTF-8"?>
<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="ArrayList" language="groovy" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="c67d12d3-80cd-46fb-8a79-5c4b0b7c76f9">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <subDataset name="TableDataset" uuid="628eb9fb-e4f0-4f6c-b5b3-277a14fda6e2">
        <parameter name="IN_ARRAY_LIST" class="java.util.ArrayList" isForPrompting="false">
            <defaultValueExpression><![CDATA[new java.util.ArrayList()]]></defaultValueExpression>
        </parameter>
        <variable name="ROW_INDEX" class="java.lang.Integer" resetType="None">
            <variableExpression><![CDATA[$V{REPORT_COUNT} - 1]]></variableExpression>
        </variable>
    </subDataset>
    <!-- WHEN YOU CALL YOUR REPORT FROM JAVA, YOU SHOULD PUT YOUR ArrayList into IN_ARRAY_LIST PARAM-->
    <parameter name="IN_ARRAY_LIST" class="java.util.ArrayList" isForPrompting="false">
        <defaultValueExpression><![CDATA[new java.util.ArrayList()]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <title>
        <band height="20" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="555" height="20" uuid="d4548efc-5711-42b3-b08a-cb138c5d55cf">
                    <!-- THIS IS FOR DEMO ONLY - I PUT 2 ROWS INTO ARRAY LIST USING PrintWhenExpression -->
                    <printWhenExpression><![CDATA[$P{IN_ARRAY_LIST}.add("ROW_1") && $P{IN_ARRAY_LIST}.add("ROW_2")]]></printWhenExpression>
                </reportElement>
                <text><![CDATA[Report Title]]></text>
            </staticText>
        </band>
    </title>
    <pageHeader>
        <band height="20" splitType="Stretch"/>
    </pageHeader>
    <pageFooter>
        <band height="20" splitType="Stretch"/>
    </pageFooter>
    <summary>
        <band height="50" splitType="Stretch">
            <componentElement>
                <reportElement key="table" x="0" y="0" width="555" height="50" uuid="042cdee2-a56a-49af-8a1b-740825446ed5"/>
                <jr:table 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="TableDataset" uuid="6f17f8a5-0bcc-4e2a-a900-cdb1e1261d24">
                        <datasetParameter name="IN_ARRAY_LIST">
                            <datasetParameterExpression><![CDATA[$P{IN_ARRAY_LIST}]]></datasetParameterExpression>
                        </datasetParameter>
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource($P{IN_ARRAY_LIST}.size())]]></dataSourceExpression>
                    </datasetRun>
                    <jr:column width="555" uuid="236aa389-6073-48fa-9b0f-02dcec80551e">
                        <jr:columnHeader height="30" rowSpan="1">
                            <staticText>
                                <reportElement x="0" y="0" width="555" height="30" uuid="18d3f3cc-13fa-4203-b239-45739b1839dc"/>
                                <text><![CDATA[ArrayList Field Value]]></text>
                            </staticText>
                        </jr:columnHeader>
                        <jr:detailCell height="20" rowSpan="1">
                            <textField>
                                <reportElement x="0" y="0" width="555" height="20" uuid="a5bd535e-091b-4eef-a0af-e70fc7d2cce2"/>
                                <textFieldExpression><![CDATA[$P{IN_ARRAY_LIST}.get($V{ROW_INDEX})]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </summary>
</jasperReport>

I hope this is clear now.