如何使用不同类型的度量格式化交叉表单元格中的数据

时间:2016-11-03 11:52:46

标签: jasper-reports crosstab

关于使用交叉表,是否有办法为度量添加任何类型的格式?

我的数据如下。

enter image description here

我需要根据为任何地理位置指定的格式显示col2,col4。例如,在印度,我们将日期显示为11/11/1986,数字为1,00,000。另一个国家可能将数据显示为11.11.1986,数字为1.00.000

我如何实现这一目标?

此外,在创建交叉表时,我不会将任何计算函数添加到交叉表中,但它会占用行组和列组组合的最高值。为什么是这样?这是相同的图片

enter image description here

同样的jrxml如下

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="crosstabmeasure" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e47b3f7d-1e00-4702-a900-be50a229f085">
    <style name="Crosstab_CH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Crosstab_CG" mode="Opaque" backcolor="#BFE1FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Crosstab_CT" mode="Opaque" backcolor="#005FB3">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Crosstab_CD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <parameter name="Locale" class="java.lang.String">
        <defaultValueExpression><![CDATA["en-IN"]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[select * from internatioinlization]]>
    </queryString>
    <field name="col1" class="java.lang.String"/>
    <field name="col2" class="java.lang.Integer"/>
    <field name="col3" class="java.sql.Timestamp"/>
    <field name="col4" class="java.lang.String"/>
    <summary>
        <band height="211" splitType="Stretch">
            <crosstab>
                <reportElement x="0" y="0" width="555" height="211" uuid="6c5ccb8a-50fc-4158-b2ba-88d864aa1e43"/>
                <rowGroup name="col11" width="60">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{col1}]]></bucketExpression>
                    </bucket>
                    <crosstabRowHeader>
                        <cellContents mode="Opaque" style="Crosstab_CH">
                            <textField>
                                <reportElement x="0" y="0" width="60" height="20" uuid="86c09a7f-46b5-4d2f-ba87-715f99d832a8"/>
                                <textFieldExpression><![CDATA[$V{col11}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabRowHeader>
                    <crosstabTotalRowHeader>
                        <cellContents>
                            <staticText>
                                <reportElement x="0" y="0" width="-2147483648" height="-2147483648" uuid="94fca0ea-1572-4d42-85d9-b06f92c73b6e"/>
                                <text><![CDATA[Total col11]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalRowHeader>
                </rowGroup>
                <columnGroup name="col41" height="20">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{col4}]]></bucketExpression>
                    </bucket>
                    <crosstabColumnHeader>
                        <cellContents mode="Opaque" style="Crosstab_CH">
                            <property name="com.jaspersoft.studio.unit.width" value="pixel"/>
                            <textField>
                                <reportElement x="0" y="0" width="120" height="20" uuid="137ef406-6a2e-4629-9d38-4858c4a5ae2c">
                                    <property name="com.jaspersoft.studio.unit.width" value="pixel"/>
                                </reportElement>
                                <textFieldExpression><![CDATA[$V{col41}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabColumnHeader>
                    <crosstabTotalColumnHeader>
                        <cellContents>
                            <staticText>
                                <reportElement x="0" y="0" width="-2147483648" height="-2147483648" uuid="5c71211d-f1db-4911-8923-2bdb208ddb99"/>
                                <text><![CDATA[Total col41]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalColumnHeader>
                </columnGroup>
                <measure name="col2_MEASURE1" class="java.lang.Integer">
                    <measureExpression><![CDATA[$F{col2}]]></measureExpression>
                </measure>
                <measure name="col3_MEASURE1" class="java.sql.Timestamp">
                    <measureExpression><![CDATA[$F{col3}]]></measureExpression>
                </measure>
                <crosstabCell width="120" height="20">
                    <cellContents mode="Opaque" style="Crosstab_CD">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="20" uuid="861d0d3a-d774-4b0c-ae7d-ace315bf305c"/>
                            <textFieldExpression><![CDATA[$V{col2_MEASURE1}]]></textFieldExpression>
                        </textField>
                        <textField>
                            <reportElement x="60" y="0" width="60" height="20" uuid="163ed502-e753-444a-942d-832d84da0a5f">
                            </reportElement>
                            <textFieldExpression><![CDATA[$V{col3_MEASURE1}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" columnTotalGroup="col41">
                    <cellContents mode="Opaque" style="Crosstab_CT">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="10" forecolor="#FFFFFF" uuid="2576b9e2-3bba-40e3-aa15-5f4f0aada549"/>
                            <textFieldExpression><![CDATA[$V{col2_MEASURE1}]]></textFieldExpression>
                        </textField>
                        <textField>
                            <reportElement x="0" y="10" width="60" height="10" forecolor="#FFFFFF" uuid="a111181f-b60f-4afd-8292-9e260c1b9ce2"/>
                            <textFieldExpression><![CDATA[$V{col3_MEASURE1}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" rowTotalGroup="col11">
                    <cellContents mode="Opaque" style="Crosstab_CT">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="10" forecolor="#FFFFFF" uuid="9adf6c9c-acee-4673-8b70-a376e7d1cbb4"/>
                            <textFieldExpression><![CDATA[$V{col2_MEASURE1}]]></textFieldExpression>
                        </textField>
                        <textField>
                            <reportElement x="0" y="10" width="60" height="10" forecolor="#FFFFFF" uuid="9baedeed-4770-4153-b639-afc0965e9467"/>
                            <textFieldExpression><![CDATA[$V{col3_MEASURE1}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="60" height="20" rowTotalGroup="col11" columnTotalGroup="col41">
                    <cellContents mode="Opaque" style="Crosstab_CT">
                        <textField>
                            <reportElement x="0" y="0" width="60" height="10" forecolor="#FFFFFF" uuid="a2805e0a-080d-42be-ad86-a7e8e666f571"/>
                            <textFieldExpression><![CDATA[$V{col2_MEASURE1}]]></textFieldExpression>
                        </textField>
                        <textField>
                            <reportElement x="0" y="10" width="60" height="10" forecolor="#FFFFFF" uuid="c485f69d-91e1-4b19-a8ab-bdbfa3cafcc6"/>
                            <textFieldExpression><![CDATA[$V{col3_MEASURE1}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
            </crosstab>
        </band>
    </summary>
</jasperReport>

1 个答案:

答案 0 :(得分:2)

最好保持 measureExpression ,并为 textFieldExpression 应用格式。

交叉表中的 textFieldExpression 可以使用交叉表的参数值进行操作。

  • 如果主要数据集主要用于交叉表,我们可以使用 交叉表单元格中的交叉表参数。
  • 如果是另一个数据集 正在使用交叉表我们可以将这个数据集的参数放在单元格中 交叉表。

实施例

数据源

csv 数据源正在使用示例。

col1,col2,col3,col4
a,a123,10,12/02/2016
a,a123,20,30/01/2016
a,a123,44,21/01/2016
a,b456,5,28/03/2016
b,a123,15,23/03/2015
b,b456,100,13/05/2015
b,b456,200,10/09/2015
b,b456,130,09/09/2017

以下示例中此数据源的数据适配器名称为 values.csv 。跳过文件的第一行 - 它包含列的名称。

报告模板

Col1 正在 rowGroup 中使用, col2 正在 columnGroup 中使用。 在 measureExpression 的帮助下,交叉表显示每个组的 col3 Sum 以及最高日期( COL4 )。

格式化将应用于 textField 。该参数将用于日期格式。

在此示例中,主数据集用于在交叉表中显示数据。我们需要将report的参数值传递给交叉表的参数,因为我们不能在交叉表中使用报表的参数(极少数例外)。

<crosstabParameter name="dateFormat" class="java.text.SimpleDateFormat">
    <parameterValueExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get("SIMPLE_DATE_FORMAT")]]></parameterValueExpression>
</crosstabParameter>

- 这是在 REPORT_PARAMETERS_MAP 报告参数的帮助下初始化交叉表的参数( dateFormat )。可以从交叉表访问 REPORT_PARAMETERS_MAP 参数的值。

报告的参数 SIMPLE_DATE_FORMAT 的值可以通过 Java 代码的帮助传递给报告。

jrxml 代码:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Formatted measures" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="values.csv"/>
    <style name="Crosstab_CH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Crosstab_CD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <parameter name="SIMPLE_DATE_FORMAT" class="java.text.SimpleDateFormat" isForPrompting="false">
        <defaultValueExpression><![CDATA[new java.text.SimpleDateFormat("dd.MM.yyyy")]]></defaultValueExpression>
    </parameter>
    <field name="col1" class="java.lang.String"/>
    <field name="col2" class="java.lang.String"/>
    <field name="col3" class="java.lang.Integer"/>
    <field name="col4" class="java.util.Date"/>
    <summary>
        <band height="270">
            <crosstab>
                <reportElement x="20" y="70" width="525" height="200" >
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                </reportElement>
                <crosstabParameter name="dateFormat" class="java.text.SimpleDateFormat">
                    <parameterValueExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get("SIMPLE_DATE_FORMAT")]]></parameterValueExpression>
                </crosstabParameter>
                <rowGroup name="col1" width="60">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{col1}]]></bucketExpression>
                    </bucket>
                    <crosstabRowHeader>
                        <cellContents mode="Opaque" style="Crosstab_CH">
                            <textField>
                                <reportElement x="0" y="0" width="60" height="20"/>
                                <textFieldExpression><![CDATA[$V{col1}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabRowHeader>
                </rowGroup>
                <columnGroup name="col2" height="20">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{col2}]]></bucketExpression>
                    </bucket>
                    <crosstabColumnHeader>
                        <cellContents mode="Opaque" style="Crosstab_CH">
                            <textField>
                                <reportElement x="0" y="0" width="180" height="20"/>
                                <textFieldExpression><![CDATA[$V{col2}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabColumnHeader>
                </columnGroup>
                <measure name="col3_MEASURE" class="java.lang.Integer" calculation="Sum">
                    <measureExpression><![CDATA[$F{col3}]]></measureExpression>
                </measure>
                <measure name="col4_MEASURE" class="java.util.Date" calculation="Highest">
                    <measureExpression><![CDATA[$F{col4}]]></measureExpression>
                </measure>
                <crosstabCell width="180" height="40">
                    <cellContents mode="Opaque" style="Crosstab_CD">
                        <textField pattern="#,##0.00">
                            <reportElement x="0" y="0" width="180" height="20"/>
                            <textFieldExpression><![CDATA[$V{col3_MEASURE}]]></textFieldExpression>
                        </textField>
                        <textField>
                            <reportElement x="0" y="20" width="180" height="20"/>
                            <textFieldExpression><![CDATA[$V{col2}.equals("a123") ? $P{dateFormat}.format($V{col4_MEASURE}) :
 new SimpleDateFormat("dd/MM/yy").format($V{col4_MEASURE})]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
            </crosstab>
        </band>
    </summary>
</jasperReport>

显示数据的表达式可能很复杂,如本例所示。在表达的帮助下:

<textFieldExpression><![CDATA[$V{col2}.equals("a123") ? $P{dateFormat}.format($V{col4_MEASURE}) : new SimpleDateFormat("dd/MM/yy").format($V{col4_MEASURE})]]></textFieldExpression>

我们以不同的格式显示不同列的日期( col2 )。

输出结果

Jaspersoft Studio 的结果将是:

Preview in JSS

借助 pattern 属性格式化的 Integer 值的总和以及借助 Java格式化的 Date 值的最大值表达。