Jasper Report 以 CSV 格式导出带有科学计数法的数字
Posted
技术标签:
【中文标题】Jasper Report 以 CSV 格式导出带有科学计数法的数字【英文标题】:Jasper Report exports numbers with scientific notation in CSV 【发布时间】: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()
方法
将文本字段值设置为="$FmyObject"
将字段类型更改为适当的 Java 类(BigInteger
、Long
等)
使用这些字段的文本字段定义如下:
<textField isBlankWhenNull="true">
<reportElement x="2109" y="0" uuid="462b3e91-55ec-4250-b90b-e524afd3bb8d"/>
<textFieldExpression><![CDATA[$FstSimcard]]></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($FstSimcard)]]></textFieldExpression>
预期和实际输出与第一步相同。
-
将
BigInteger
字段转换(不强制转换)为BigDecimal
并使用BigDecimal.toPlainString()
方法
<textFieldExpression><![CDATA[new java.math.BigDecimal($FstSimcard.longValue()).toPlainString()]]></textFieldExpression>
预期和实际输出与第一步相同。
-
将文本字段值设置为
="$FmyObject"
<textFieldExpression><![CDATA["=\"" + $FstSimcard + "\""]]></textFieldExpression>
预期输出:与第一步相同
实际输出:CSV 文件显示 ='',其中没有字段值。
将字段类型更改为适当的 Java 类(BigInteger
、Long
等)
预期和实际输出与第一步相同。
一些附加信息:
我不想使用这样的东西,因为除了字段值之外我不能显示其他东西:<textFieldExpression><![CDATA["'" + $FstSimcard]]></textFieldExpression>
提前致谢
编辑:报告的数据源定义如下:
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,业务逻辑很少。 我编辑了帖子,添加了数据源的定义方式。当您说“生豆”时,您是指上面定义的豆吗? 【参考方案1】:net.sf.jasperreports.export.xls.detect.cell.type - 此属性仅适用于 XLS/XLSX 导出,因为这些格式保留了丰富的数据格式。
CSV 是非常简单的格式。尝试在记事本中打开 CSV:如果没问题,那么问题出在 MS-Excel 方面。 Excel 还具有 limitation 的数字精度 = 15 位。
可以通过Data选项卡->From Text将CSV导入Excel,然后设置列分隔符、大数字的文本格式等。
【讨论】:
你是对的。我用文本编辑器(在我的例子中是 Notepad++)打开了 CSV 文件,数字显示正确。这意味着问题不是来自 Jasper,而是来自 MS Excel,所以我在这里无能为力。非常感谢。以上是关于Jasper Report 以 CSV 格式导出带有科学计数法的数字的主要内容,如果未能解决你的问题,请参考以下文章