java - Jasper 报告 - 数字格式问题
问题描述
我在 Jaspersoft Studio 6.11.0 + Java lib net.sf.jasperreports 6.11.0 上遇到了一个奇怪的问题
我正在测试一份简单的报告,从 Studio 生成的报告很好,但从 Java 生成的报告不行。
这是从 Jaspersoft Studio 生成的
这是从 Java 代码生成的
Java 生成
从 Java 代码中,Pojo 实例填充了数据,用 Jackson 编组,用 JRXmlUtils 解析为 org.w3c.dom.Document,然后作为 PARAMETER_XML_DATA_DOCUMENT 发送到 Jasper。
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);
执行上述代码将生成带有错误格式(左移 2 位)的数字(BigDecimal)打印的报告。
Jaspersoft 报告生成
从上面的代码中,打印出来的带有 syso 的字符串是
<?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>
如果它采用该字符串,则将其放入 xml 文件中并将其用作 Jaspersoft Studio 中的数据适配器,然后生成的报告将显示预期值。
我已经检查了 Locale 并且 Java 和 Studio 都使用相同的。
这是报告:
<?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>
解决方案
我回答了我自己的问题,因为我找到了解决问题的方法:)
我很确定这与区域设置有关,因为在意大利,默认的小数点分隔符是逗号而不是点,但甚至强制
parameters.put(JRParameter.REPORT_LOCALE, Locale.US)
没有解决任何事情。
然后我发现,因为我正在通过
JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT
我也需要设置
JRXPathQueryExecuterFactory.XML_LOCALE
为了让报告以预期的方式评估输入数据,现在它就像一个魅力:D
遵循固定的代码片段
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);
推荐阅读
- c# - Winforms .net core 3 连接字符串位置
- excel - VBA:选择左上角单元格的最佳方法
- core-data - 菜单中缺少 Xcode 11“创建 NSManagedObject 子类”
- algorithm - 为数组值的一部分求和的最佳算法
- php - Symfony 4.2 DateTimeImmutable 验证器错误
- reactjs - 如何将信息传递到此 API 端点?
- html - 嵌入 Youtube 代码在 Pardot 电子邮件中不起作用
- html - 根据网格中元素的数量自动调整css中的文本大小
- cordova - 在 Ionic 4 中保存移动应用程序暂停/退出状态的最佳实践
- css - z-index 普通 div 和 flex div