Reputation: 81
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
This is generated from Java code
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
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