fndong
fndong

Reputation: 81

How to get value of JasperReports parameter (JRParameter object) using Java?

I need to retrieve value parameter from JasperReports's report using JRParameter.

My source code:

JRParameter[] params = jasperReport.getParameters();
Map<String, JRParameter> jrParameters = new HashMap<String, JRParameter>();

for(JRParameter param : params) {
    if(!param.isSystemDefined() && param.isForPrompting()){
        System.out.println(" param name : " + param.getName());

        // test is the name parameter in jasper report
        if (param.getName().trim().equals("text")) {
            param.getDefaultValueExpression();
            jrParameters.put(param.getName(), param);
        }
    }
}
// the output not coming out.
System.out.println(" return mapping : " + jrParameters.get("text"));

How to retrieve value from Parameter "text", does any way to retrieve the values from parameter?

Upvotes: 1

Views: 5569

Answers (1)

Alex K
Alex K

Reputation: 22867

The JasperReport object contains the array of report's parameters.

The JasperReport.getParameters() method returns all parameters: system (built-in) and the parameters of your report (defined at template).

You can not get the value of parameter because the is no any value at JasperReport object. It is just a compiled version of report's template. You can get the name, default expression, class of parameter, description, properties and so on.

Looks like you need to get default expressions of parameters.

The sample of working with parameters got from JasperReport object

I used the simple template:

<?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="Test parameters" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="stringParam" class="java.lang.String">
        <defaultValueExpression><![CDATA["string value"]]></defaultValueExpression>
    </parameter>
    <parameter name="intParam" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[11]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="30">
            <staticText>
                <reportElement x="0" y="0" width="100" height="30"/>
                <text><![CDATA[Title]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

The report contains two parameters: of String and Integer types.

The Java code will be:

JasperReport jasperReport;

try (InputStream inputStream = JRLoader.getResourceInputStream("report.jrxml")) {
    jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(inputStream));
}

List<String> paramsNames = Arrays.asList("stringParam", "intParam"); // we are going to show information about only this parameters

JRParameter[] parameters = jasperReport.getParameters();
for (JRParameter parameter : Arrays.stream(parameters).filter(param -> paramsNames.contains(param.getName())).collect(Collectors.toList())) {
    JRExpression expression = parameter.getDefaultValueExpression();
    if (expression != null) {
        System.out.println(String.format("Parameter name: %s, class: %s, expression: %s", parameter.getName(), parameter.getValueClass().toString(), expression.getText())); // we are showing name, class and default expression of parameter
    }
}

The output will be:

Parameter name: stringParam, class: class java.lang.String, expression: "string value"
Parameter name: intParam, class: class java.lang.Integer, expression: 11

Upvotes: 2

Related Questions