“ Jasper报告”以CSV格式导出带有科学符号的数字

时间:2019-03-26 15:13:44

标签: jasper-reports

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

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

我无济于事地遵循了这些步骤:

  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

<field name="stSimcard" class="java.lang.String"/>

对于上述每个步骤:

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

期望值:使用Microsoft Excel打开时,创建的CSV文件应以正常表示法显示该值,即“ 8956030165644580”

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

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

<textFieldExpression><![CDATA[new java.text.DecimalFormat("0").format($F{stSimcard})]]></textFieldExpression>

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

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

<textFieldExpression><![CDATA[new java.math.BigDecimal($F{stSimcard}.longValue()).toPlainString()]]></textFieldExpression>

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

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

<textFieldExpression><![CDATA["=\"" + $F{stSimcard} + "\""]]></textFieldExpression>

预期输出:与第一步相同

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

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

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

一些附加信息:

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

<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);

1 个答案:

答案 0 :(得分:0)

net.sf.jasperreports.export。 xls .detect.cell.type-此属性仅适用于XLS / XLSX导出,因为这些格式保留了丰富的数据格式。

CSV是非常简单的格式。尝试在记事本中打开CSV:如果可以,则问题出在MS-Excel一侧。 Excel也具有limitation的数字精度= 15位数字。

可以通过数据标签-> 从文本将CSV导入Excel,然后设置列分隔符,大数字的文本格式等。