dBocca
dBocca

Reputation: 81

Jasper Report - Number format issue

i'm facing a strange issue on Jaspersoft Studio 6.11.0 + Java lib net.sf.jasperreports 6.11.0

I'm testing a simple report and the generated one from Studio is fine but the one generated from Java isn't.

This is generated from Jaspersoft Studio

from Jaspersoft Studio

This is generated from Java code

from Java

Java generation

From the Java code, a Pojo instance is filled with data, marshalled with Jackson, parsed with JRXmlUtils into a org.w3c.dom.Document and then send to Jasper as PARAMETER_XML_DATA_DOCUMENT.

    JasperReport jasperReport = JasperReportUtils.generateJasperReportInstance(dataModel);

    StringWriter writer = new StringWriter();

    JAXBContext context = JAXBContext.newInstance(ContoEconomicoReport.class);
    context.createMarshaller().marshal(dataModel, writer);

    String str = writer.toString();

    System.out.println(str);

    Document document = JRXmlUtils.parse(new ByteArrayInputStream(str.getBytes()));

    parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);

    JasperPrint jPrint = JasperFillManager.fillReport(jasperReport, parameters);

Executing the above code will generate the report with the numbers (BigDecimal) printed with the wrong format (2 digits left shifted).

Jaspersoft Report generation

From the above code, the printed String with syso is

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<report>
    <object>
        <controvalore>2564894.01</controvalore>
    </object>
    <object>
        <controvalore>25648946.21</controvalore>
    </object>
    <object>
        <controvalore>25648.01</controvalore>
    </object>
</report>

If it take that String, put it in a xml file and use it as Data Adapter in Jaspersoft Studio, then the generated report shows the expected values.

I've already checked Locale and both Java and Studio are using the same.

This is the report:

    <?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.11.0.final using JasperReports Library version 6.11.0-0c4056ccaa4d25a5a8c45672d2f764ea3498bebb  -->
<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="CONTO_ECONOMICO" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isSummaryNewPage="true" uuid="ec42ac74-05f9-4eeb-988b-cb92c2bd1e27">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="ReportDataAdapter"/>
    <property name="com.jaspersoft.studio.unit." value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
    <subDataset name="ListDataset" uuid="3b446c0b-520e-494d-97e6-0118bad0afb6">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="ReportDataAdapter"/>
        <queryString language="XPath">
            <![CDATA[/report/object]]>
        </queryString>
        <field name="controvalore" class="java.math.BigDecimal">
            <property name="net.sf.jasperreports.xpath.field.expression" value="controvalore"/>
            <fieldDescription><![CDATA[controvalore]]></fieldDescription>
        </field>
    </subDataset>
    <parameter name="XML_DATA_DOCUMENT" class="org.w3c.dom.Document" isForPrompting="false"/>
    <parameter name="XML_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"/>
    <parameter name="XML_FILE" class="java.io.File" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.xml.source" class="java.lang.String" isForPrompting="false"/>
    <parameter name="XML_DATE_PATTERN" class="java.lang.String" isForPrompting="false"/>
    <parameter name="XML_NUMBER_PATTERN" class="java.lang.String" isForPrompting="false"/>
    <parameter name="XML_LOCALE" class="java.util.Locale" isForPrompting="false"/>
    <parameter name="XML_TIME_ZONE" class="java.util.TimeZone" isForPrompting="false"/>
    <queryString language="xPath">
        <![CDATA[/report]]>
    </queryString>
    <background>
        <band splitType="Stretch"/>
    </background>
    <detail>
        <band height="348" splitType="Stretch">
            <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.FreeLayout"/>
            <componentElement>
                <reportElement x="70" y="0" width="170" height="50" uuid="52daaff5-b717-469a-b917-dea9d70a05e0">
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.FreeLayout"/>
                    <property name="com.jaspersoft.studio.unit.width" value="px"/>
                </reportElement>
                <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="ListDataset" uuid="0e9f5f26-3550-44fd-b1c3-bc3417de86e6">
                        <datasetParameter name="XML_DATA_DOCUMENT">
                            <datasetParameterExpression><![CDATA[$P{XML_DATA_DOCUMENT}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_INPUT_STREAM">
                            <datasetParameterExpression><![CDATA[$P{XML_INPUT_STREAM}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_FILE">
                            <datasetParameterExpression><![CDATA[$P{XML_FILE}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="net.sf.jasperreports.xml.source">
                            <datasetParameterExpression><![CDATA[$P{net.sf.jasperreports.xml.source}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_DATE_PATTERN">
                            <datasetParameterExpression><![CDATA[$P{XML_DATE_PATTERN}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_NUMBER_PATTERN">
                            <datasetParameterExpression><![CDATA[$P{XML_NUMBER_PATTERN}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_LOCALE">
                            <datasetParameterExpression><![CDATA[$P{XML_LOCALE}]]></datasetParameterExpression>
                        </datasetParameter>
                        <datasetParameter name="XML_TIME_ZONE">
                            <datasetParameterExpression><![CDATA[$P{XML_TIME_ZONE}]]></datasetParameterExpression>
                        </datasetParameter>
                        <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                    </datasetRun>
                    <jr:listContents height="50" width="170">
                        <rectangle>
                            <reportElement x="0" y="0" width="170" height="50" backcolor="rgba(255, 255, 255, 0.0)" uuid="0f5160ff-c98b-470e-b70e-a8a04ac36dd7">
                                <property name="com.jaspersoft.studio.unit.x" value="px"/>
                                <property name="com.jaspersoft.studio.unit.y" value="px"/>
                            </reportElement>
                        </rectangle>
                        <textField pattern="#,##0.00">
                            <reportElement x="0" y="0" width="170" height="50" uuid="09c367e3-c63f-4e1c-9602-080e5fe20049"/>
                            <textElement textAlignment="Right" verticalAlignment="Middle"/>
                            <textFieldExpression><![CDATA[$F{controvalore}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

Upvotes: 1

Views: 2199

Answers (1)

dBocca
dBocca

Reputation: 81

I answer my own question since i found how to solve the problem :)

I was pretty sure that it was something Locale related, since in Italy the default decimal separator is comma instead dot, but even forcing

parameters.put(JRParameter.REPORT_LOCALE, Locale.US)

didn't solve a thing.

Then i found out that, since i'm sending data through

JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT

i need to set also

JRXPathQueryExecuterFactory.XML_LOCALE

in order to let the report evaluate input data in the expected way, and now it works like a charm :D

Following the fixed code snippet

JasperReport jasperReport = JasperReportUtils.generateJasperReportInstance(dataModel);

StringWriter writer = new StringWriter();

JAXBContext context = JAXBContext.newInstance(ContoEconomicoReport.class);
context.createMarshaller().marshal(dataModel, writer);

String str = writer.toString();

Document document = JRXmlUtils.parse(new ByteArrayInputStream(str.getBytes()));

parameters.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, document);
parameters.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.US);

JasperPrint jPrint = JasperFillManager.fillReport(jasperReport, parameters);

Upvotes: 1

Related Questions