【问题标题】:Jasper Report exports numbers with scientific notation in CSVJasper Report 以 CSV 格式导出带有科学计数法的数字
【发布时间】:2019-03-26 15:13:43
【问题描述】:

我有一个使用 bean 集合作为数据源的 Jasper 报告。 我有一个 Java 应用程序,它使用这个 Jasper 报告将一些数据导出到 CSV 文件。 问题是,当导出时,bean 集合中定义为 BigInteger 的某些列以科学记数法显示,而我无法选择如何以正常记数法显示它们。

我通过互联网进行了调查,包括以下链接:

我按照这些步骤没有用:

  1. 将参数net.sf.jasperreports.export.xls.detect.cell.type设置为true
  2. 使用类java.text.DecimalFormat并将格式设置为“0”
  3. BigInteger 字段转换(不强制转换)为BigDecimal 并使用BigDecimal.toPlainString() 方法
  4. 将文本字段值设置为="$F{myObject}"
  5. 将字段类型更改为适当的 Java 类(BigIntegerLong 等)

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

<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

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

对于上述每个步骤:

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

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

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

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

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

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

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

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

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

  1. 将文本字段值设置为="$F{myObject}"

&lt;textFieldExpression&gt;&lt;![CDATA["=\"" + $F{stSimcard} + "\""]]&gt;&lt;/textFieldExpression&gt;

预期输出:与第一步相同

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

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

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

一些附加信息:

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

&lt;textFieldExpression&gt;&lt;![CDATA["'" + $F{stSimcard}]]&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,业务逻辑很少。
  • 我编辑了帖子,添加了数据源的定义方式。当您说“生豆”时,您是指上面定义的豆吗?

标签: jasper-reports


【解决方案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,所以我在这里无能为力。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
相关资源
最近更新 更多