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 类(BigIntegerLong 等)

使用这些字段的文本字段定义如下:

<textField isBlankWhenNull="true">
    <reportElement x="2109" y="0"   uuid="462b3e91-55ec-4250-b90b-e524afd3bb8d"/>
    <textFieldExpression><![CDATA[$FstSimcard]]></textFieldExpression>
</textField>

几乎所有这些字段在报告中都被声明为String,尽管有些被声明为java.math.BigInteger

&lt;field name="stSimcard" class="java.lang.String"/&gt;

对于上述每个步骤:

    将参数net.sf.jasperreports.export.xls.detect.cell.type设置为true

预期值:创建的 CSV 文件应以正常符号显示该值,即用 Microsoft Excel 打开时为“8956030165644580”

实际值:该值以科学计数法显示,即单元格中的 8,956E+15,但 ih 在公式的文本字段中显示完整的数字,它迫使我更改单元格格式以显示数字正确

    使用java.text.DecimalFormat类并将格式设置为“0”:

&lt;textFieldExpression&gt;&lt;![CDATA[new java.text.DecimalFormat("0").format($FstSimcard)]]&gt;&lt;/textFieldExpression&gt;

预期和实际输出与第一步相同。

    BigInteger 字段转换(不强制转换)为BigDecimal 并使用BigDecimal.toPlainString() 方法

&lt;textFieldExpression&gt;&lt;![CDATA[new java.math.BigDecimal($FstSimcard.longValue()).toPlainString()]]&gt;&lt;/textFieldExpression&gt;

预期和实际输出与第一步相同。

    将文本字段值设置为="$FmyObject"

&lt;textFieldExpression&gt;&lt;![CDATA["=\"" + $FstSimcard + "\""]]&gt;&lt;/textFieldExpression&gt;

预期输出:与第一步相同

实际输出:CSV 文件显示 ='',其中没有字段值。

    将字段类型更改为适当的 Java 类(BigIntegerLong 等)

    预期和实际输出与第一步相同。

一些附加信息:

我不想使用这样的东西,因为除了字段值之外我不能显示其他东西:

&lt;textFieldExpression&gt;&lt;![CDATA["'" + $FstSimcard]]&gt;&lt;/textFieldExpression&gt;

如果你们中的一些人说唯一的解决方案是更改 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,业务逻辑很少。 我编辑了帖子,添加了数据源的定义方式。当您说“生豆”时,您是指上面定义的豆吗? 【参考方案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 格式导出带有科学计数法的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何将报告导出为 PDF/A-1a、PDF/A-1b?

导入导出, Excel,CSV格式数据复制的各种特殊情况

将 MySQL 导出为 CSV,一些列带引号,一些不带引号

使用javascript将JQGrid数据导出到Excel

使用 jasper 将日期导出到 Excel

php怎么导出大量数据的Excel