【发布时间】:2019-03-26 15:13:43
【问题描述】:
我有一个使用 bean 集合作为数据源的 Jasper 报告。 我有一个 Java 应用程序,它使用这个 Jasper 报告将一些数据导出到 CSV 文件。 问题是,当导出时,bean 集合中定义为 BigInteger 的某些列以科学记数法显示,而我无法选择如何以正常记数法显示它们。
我通过互联网进行了调查,包括以下链接:
-
JasperReports: How to format numeric data with Excel exporter
-
Export to Excel format: cell type "general" and number turn into scientific notation
-
large number converted to scientific format by default in csv using jasper report
-
https://community.jaspersoft.com/wiki/excel-export-number-stored-text
我按照这些步骤没有用:
- 将参数
net.sf.jasperreports.export.xls.detect.cell.type设置为true - 使用类
java.text.DecimalFormat并将格式设置为“0” - 将
BigInteger字段转换(不强制转换)为BigDecimal并使用BigDecimal.toPlainString()方法 - 将文本字段值设置为
="$F{myObject}" - 将字段类型更改为适当的 Java 类(
BigInteger、Long等)
使用这些字段的文本字段定义如下:
<textField isBlankWhenNull="true">
<reportElement x="2109" y="0" width="90" height="20" uuid="462b3e91-55ec-4250-b90b-e524afd3bb8d"/>
<textFieldExpression><![CDATA[$F{stSimcard}]]></textFieldExpression>
</textField>
几乎所有这些字段在报告中都被声明为String,尽管有些被声明为java.math.BigInteger:
<field name="stSimcard" class="java.lang.String"/>
对于上述每个步骤:
- 将参数
net.sf.jasperreports.export.xls.detect.cell.type设置为true
预期值:创建的 CSV 文件应以正常符号显示该值,即用 Microsoft Excel 打开时为“8956030165644580”
实际值:该值以科学计数法显示,即单元格中的 8,956E+15,但 ih 在公式的文本字段中显示完整的数字,它迫使我更改单元格格式以显示数字正确
- 使用
java.text.DecimalFormat类并将格式设置为“0”:
<textFieldExpression><![CDATA[new java.text.DecimalFormat("0").format($F{stSimcard})]]></textFieldExpression>
预期和实际输出与第一步相同。
- 将
BigInteger字段转换(不强制转换)为BigDecimal并使用BigDecimal.toPlainString()方法
<textFieldExpression><![CDATA[new java.math.BigDecimal($F{stSimcard}.longValue()).toPlainString()]]></textFieldExpression>
预期和实际输出与第一步相同。
- 将文本字段值设置为
="$F{myObject}"
<textFieldExpression><![CDATA["=\"" + $F{stSimcard} + "\""]]></textFieldExpression>
预期输出:与第一步相同
实际输出:CSV 文件显示 ='',其中没有字段值。
-
将字段类型更改为适当的 Java 类(
BigInteger、Long等)预期和实际输出与第一步相同。
一些附加信息:
- 我不想使用这样的东西,因为除了字段值之外我不能显示其他东西:
<textFieldExpression><![CDATA["'" + $F{stSimcard}]]></textFieldExpression>
- 如果你们中的一些人说唯一的解决方案是更改 Excel 中的单元格格式,我会理解的。
提前致谢
编辑:报告的数据源定义如下:
Collection<VentasMovil> elementos = new ArrayList<VentasMovil>();
//Filling collection from another collection obtained from database through a Hibernate repository interface
JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(elementos);
【问题讨论】:
-
“我有一个使用 bean 集合作为数据源的 Jasper 报告”。这可能是个问题。将现成的值发送给 Jasper 通常更容易。这也更容易进行单元测试。
-
您的意思是使用 SQL Select 或 XML 作为数据源?
-
不,我的意思是:您可以在 Java 端完成繁重的工作,然后将带有已格式化数据的 bean 发送到 Jasper,而不是发送原始 bean。然后 Jasper 只需显示接收到的 bean,业务逻辑很少。
-
我编辑了帖子,添加了数据源的定义方式。当您说“生豆”时,您是指上面定义的豆吗?
标签: jasper-reports