如何在特定方案中对 ireport 交叉表中的列进行排序

how to sort columns in ireport crosstab in a specific scheme

下图显示了我在 ireport 中的交叉表:

我想按特定顺序对我的列进行排序,知道在交叉表数据中,我放置了具有以下属性的对象列表 List<ChampEtatAteliers>

public class ChampEtatAteliers {

    private String numero;
    private String denominationFr;
    private String etatEntreeSortie;

    public ChampEtatAteliers(String numero, String denominationFr, String etatEntreeSortie) {
        this.numero = numero;
        this.denominationFr = denominationFr;
        this.etatEntreeSortie = etatEntreeSortie;
    }
}

列显示etatEntreeSortie,行显示denominationFrnumero用于交叉表中的计数

String rapportLien = "/SituationEquipement.jasper";
Map parametres = new HashMap();
JRBeanCollectionDataSource data = new JRBeanCollectionDataSource(atelierses);

in java 我将这些对象放在列表 atelierses List<ChampEtatAteliers> 中,所以有什么方法可以对列表或交叉表报告中的列进行排序,我的 xml ireport上的代码如下:

<columnGroup name="nbreVehicule" height="66">
    <bucket order="Descending" class="java.lang.String">
        <bucketExpression><![CDATA[$F{nbreVehicule}]]></bucketExpression>
        <orderByExpression><![CDATA[$V{MyOrderByField_measure}]]></orderByExpression>
    </bucket>
    <crosstabColumnHeader>
        <cellContents backcolor="#F0F8FF" mode="Opaque">
            <textField>
                <reportElement style="Crosstab Data Text" x="0" y="0" width="85" height="66" uuid="2109b261-1b20-493a-b664-ce59731c4a20"/>
                <box topPadding="1" leftPadding="1" bottomPadding="1" rightPadding="1"/>
                <textElement>
                    <font isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$V{nbreVehicule}]]></textFieldExpression>
            </textField>
        </cellContents>
    </crosstabColumnHeader>
    <crosstabTotalColumnHeader>
        <cellContents/>
    </crosstabTotalColumnHeader>
</columnGroup>
<measure name="MyOrderByField_measure" class="java.lang.Integer"  calculation="Nothing" >
    <measureExpression><![CDATA[$F{myOrderByField}]]></measureExpression>
</measure>

在 jasper 报告中,通过设置 order 属性,交叉表 columnGroup 可以按 升序降序 排序在 bucket

例子

<columnGroup name="GROUP" height="16" headerPosition="Center">
    <bucket order="Descending" class="java.lang.String">
        <bucketExpression><![CDATA[$F{MyField}]]></bucketExpression>
    </bucket>
    .....
</columnGroup>

如果您需要用户定义的订单,您应该使用orderByExpression

  1. 根据您喜欢的订单定义衡量标准

    <measure name="myOrderByField_measure" class="java.lang.Integer" calculation="First">
        <measureExpression><![CDATA[$F{myOrderByField}]]></measureExpression>
    </measure>
    
  2. 使用orderByExpression

    中的度量
    <columnGroup name="GROUP" height="16" headerPosition="Center">
      <bucket class="java.lang.String">
        <bucketExpression><![CDATA[$F{myField}]]></bucketExpression>
        <orderByExpression><![CDATA[$V{myOrderByField_measure}]]></orderByExpression>
    </bucket>
    .....
    </columnGroup>
    

在您的示例中,这可以通过在 ChampEtatAteliers class 示例 private int myOrderByField; 中引入一个新字段然后根据需要通过代码设置来实现。

另一个解决方案,将return一个自己的对象(class)作为MyField并实现Comparable,生成所需的订单。

编辑: 解决方法,OP 无法使 orderByExpression 正常工作。

由于 myOrderByField 对于 nbreVehicule 是唯一的(一对一相关),他可以在 bucketExpression

中使用 myOrderByField
<measure name="nbreVehicule_measure" class="java.lang.String">
   <measureExpression><![CDATA[$F{nbreVehicule}]]></measureExpression>
</measure>

<columnGroup name="nbreVehicule" height="66">
   <bucket class="java.lang.Integer">
     <bucketExpression><![CDATA[$F{myOrderByField}]]></bucketExpression>
   </bucket>
   ....
   <textFieldExpression><![CDATA[$V{nbreVehicule_measure}]]></textFieldExpression>
   .....
</columnGroup>

因此 bucketExpression 不需要与 crosstabColumnHeader

中显示的文本相同