ZetCode

JasperReports 数据排序

最后修改日期:2024 年 2 月 12 日

在本文中,我们将介绍如何在使用 JasperReports 库创建的报告中排序数据。sortField 标签用于排序数据。

JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 以简单灵活的方式创建面向页面、可打印的文档。

JasperReports 数据排序示例

以下应用程序从 bean 集合数据源加载数据,并使用 JasperReports 库从中创建报告。报告是一个 PDF 文件。

report.xml
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
   "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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="report" pageWidth="595" pageHeight="842"
   columnWidth="555" leftMargin="20" rightMargin="20"
   topMargin="20" bottomMargin="20">

   <style name="textRight" hAlign="Right" vAlign="Middle"/>

   <field name="id" class="java.lang.Long"/>
   <field name="name"/>
   <field name="price" class="java.lang.Integer"/>

   <sortField name="name" order="Descending"/>

    <detail>
      <band height="15">

         <textField>
            <reportElement x="0" y="0" width="50" height="15"/>
            <textElement/>
            <textFieldExpression class="java.lang.Long">
               <![CDATA[$F{id}]]>
            </textFieldExpression>
         </textField>

         <textField>
            <reportElement x="150" y="0" width="100" height="15"/>
            <textElement/>
            <textFieldExpression class="java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>

         <textField>
            <reportElement x="200" y="0" width="100" height="15" style="textRight"/>
            <textElement/>
            <textFieldExpression class="java.lang.Integer">
               <![CDATA[$F{price}]]>
            </textFieldExpression>
         </textField>

      </band>
   </detail>

</jasperReport>

这是报告模板文件。模板仅包含详情带。在详情带中,每个元素都会为数据源提供的每个记录重复一次。

<sortField name="name" order="Descending"/>

使用 sortField 标签,我们按 name 字段降序排序数据。

<textField>
    <reportElement x="150" y="0" width="100" height="15"/>
    <textElement/>
    <textFieldExpression class="java.lang.String">
       <![CDATA[$F{name}]]>
    </textFieldExpression>
 </textField>

name 字段在 textField 标签中使用 $F{} 表达式显示。

report.gvy
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
import groovy.transform.Immutable

@Immutable
class Car {
    Long id;
    String name;
    int price;
}

def cars = [
    new Car(1L, 'Audi', 52642),
    new Car(2L, 'Mercedes', 57127),
    new Car(3L, 'Skoda', 9000),
    new Car(4L, 'Volvo', 29000),
    new Car(5L, 'Bentley', 350000),
    new Car(6L, 'Citroen', 21000),
    new Car(7L, 'Hummer', 41400),
    new Car(8L, 'Volkswagen', 21600),
]

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

def ds = new JRBeanCollectionDataSource(cars)

def params = [:]
def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)

JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")

在 Groovy 文件中,我们将 Car 对象列表传递给报告。

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

我们将 XML 模板文件编译成一个 JasperReportJasperReport 是一个已编译的模板,可以填充数据。

def cars = [
    new Car(1L, 'Audi', 52642),
    new Car(2L, 'Mercedes', 57127),
    new Car(3L, 'Skoda', 9000),
    new Car(4L, 'Volvo', 29000),
    new Car(5L, 'Bentley', 350000),
    new Car(6L, 'Citroen', 21000),
    new Car(7L, 'Hummer', 41400),
    new Car(8L, 'Volkswagen', 21600),
]

汽车列表是我们的数据。

var ds = new JRBeanCollectionDataSource(cars);

JRBeanCollectionDataSource 是一个数据源实现,它包装了一系列 Java bean 对象。我们将四个 Car bean 放入数据源中。

def ds = new JRBeanCollectionDataSource(cars)

创建了一个 JasperPrint 对象;这是一个可以查看、打印或导出到其他格式的对象。

JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")

JasperExportManager.exportReportToPdfFile 方法将 JasperPrint 导出为 PDF 文件。

在本文中,我们创建了一个带有排序数据的 PDF 文件报告。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年起就一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 JasperReports 教程