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

标签 java sorting jasper-reports crosstab

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

crosstab

我想按特定顺序对列进行排序,因为我知道在交叉表数据中,我放置了一个对象列表 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显示在列中,denominationFr显示在行中,并且 numero用于交叉表中的计数

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

在java中我将这些对象放入列表ateliersesList<ChampEtatAteliers> ,那么有没有办法对列表中或交叉表ireport中的列进行排序,我的ireport上的xml代码如下:

<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 报表中,交叉表 columnGroup 可以通过设置 bucket 上的 order 属性按升序降序排序

示例

<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 类示例 private int myOrderByField; 中引入一个新字段,然后通过代码根据需要进行设置来实现。

另一个解决方案,是将自己的对象(类)作为 MyField 返回并实现 Comparable ,生成所需的顺序。

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

由于 myOrderByFieldnbreVehicule 是唯一的(1 对 1 相关),因此他可以在 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 中显示的文本相同

关于java - 如何在特定方案中对 ireport 交叉表中的列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826005/

相关文章:

java - 带有 WindowListener 的 JDialog - 未触发 windowClosing

mysql - mysql - 如何按最多两列排序,这两个列在MySQL中可以为空?

java - 如何使用 JasperReports 生成 HTML 报告流?

java - XmlBeanFactory 无法加载属性文件作为占位符?

jasper-reports - 如何在 JasperReports 中转义特殊字符?

java - 为什么我们通过调用 Acceptor.accept() 而不是 Visitor.visit() 来启动 Visitor?

java - Java 中的渗透

java - 如何调用外部类方法内定义的类的实例

c++ - 倒序排序。 "Don' t 重复你自己”规则

c - 该函数是否将整数从小到大排序?