当前位置: 首页 > 教程 > JasperReports >

JasperReports 报表的组成结构

精华
小牛编辑
116浏览
2023-03-14

1 JasperReports 报表的主要组成结构

我们在《JasperReports 介绍》一章中讨论了简单报表模板的结构。在类似的行中,JasperReports 将报告模板构建为多个部分。节是具有指定高度的报表部分,可以包含报表对象,如线条、矩形、图像或文本字段。

报表引擎在报表填充时迭代提供的报表数据源的虚拟记录。根据每个部分的定义行为,引擎然后在适当的时候呈现每个报告部分。例如,为数据源中的每条记录呈现细节部分。发生分页时,页面页眉和页脚部分会根据需要呈现。

在 JasperReports 中,术语和报告部分也称为报告带。部分由一个或多个带组成。这些部分在报告生成时重复填写并准备最终文件。

JasperReports 中的报表模板具有以下主要部分:

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

下表总结了每个部分:

报表结构部分 描述
Title 此部分仅在报表开头出现一次。
Page Header 此部分出现在生成的文档中每一页的开头。
Column Header 此部分出现在生成的文档中每一列的开头。如果报告只定义了一列,则忽略列标题和页脚部分。
Group Header 本节由报表组(报表组章节)介绍。每次分组表达式更改其值时,组标题部分都会打印在详细信息部分上方。如果定义了多个组,则按组定义的顺序打印组标题。
Detail 对报表数据源提供的每一行数据重复此部分。细节部分可以由多个带组成。
Group Footer 本节由报表组(报表组)介绍。在分组表达式的值更改之前,组页脚部分打印在详细信息部分下方。始终为数据源中的最后一行数据打印组页脚。如果定义了多个组,则以组定义的相反顺序打印组页脚。
Column Footer 此部分出现在每列的底部。如果报表的列数为 1,则忽略列标题和页脚部分。
Page Footer 此部分出现在每页的底部。
Last Page Footer 本节取代了报告最后一页上的常规页脚。如果还存在摘要部分,则这可能不是文档的最后一页。当摘要信息必须显示在最后一页的底部时,此部分有时很有用。
Summary 此部分仅在报表末尾出现一次。
No Data 当无数据打印报表属性设置为无数据部分时,将打印此部分。如果在报表模板中定义了 <noData> 部分,并且数据源为空,则 <noData> 部分将是填充时唯一考虑的部分,其内容将生成报表输出。
Background 背景部分显示在每一页上,不能溢出到下一页。放置在此部分的元素在页面初始化时进行评估并显示在背景中。所有其他页面对象都显示在背景对象之上。此部分对于创建页面水印很有用。

2 JasperReports Section/元素/属性关系

下图显示了报表部分中的元素和属性关系。

3 JasperReports Section元素

所有上述报表部分都是可选的。但是任何报告模板都至少有一个这样的部分。每个部分都包含一个 <band> 元素作为其唯一的子元素。<band> 可以包含零个或多个以下子元素 

<line>、<rectangle>、<ellipse>、<image>、<staticText>、<textField>、<subReport> 或 <elementGroup>

这些元素中的每一个都必须包含一个 <reportElement> 作为其第一个元素(elementGroup 除外)。< reportElement > 确定该特定元素的数据布局方式。与变量和参数不同,报告元素不需要具有名称,因为通常您不需要在报告模板中获取任何单个元素。

下表总结了 <reportElement>的属性:

属性 描述 有效值
x 指定带元素的 x 坐标。 一个整数值,以像素为单位指示元素的 x 坐标。此属性是必需的。
y 指定带元素的 y 坐标。 一个整数值,以像素为单位指示元素的 y 坐标。此属性是必需的。
width 指定带元素的宽度。 一个整数值,指示元素宽度(以像素为单位)。此属性是必需的。
height 指定带元素的高度。 一个整数值,指示元素高度(以像素为单位)。此属性是必需的。
key 带元素的唯一标识符。 唯一的字符串值。
stretchType 指定当包含带拉伸时元素如何拉伸

NoStretch (default) : 元素不会拉伸。

RelativeToTallestObject : 元素将拉伸以容纳其组中最高的对象。

RelativeToBand : 元素将拉伸以适应乐队的高度。

positionType 指定条带拉伸时元素的位置。

Float : 元素将根据周围元素的大小移动。

FixRelativeToTop (default) : 元素将保持相对于带顶部的固定位置。

FixRelativeToBottom : 元素将保持相对于乐队底部的固定位置。

isPrintRepeatedValues 指定是否打印重复值。

true (default) : 将打印重复值。

false : 不会打印重复值。

mode 指定元素的背景模式 不透明、透明
isRemoveLineWhenBlank 指定当元素为空白且同一水平空间中没有其他元素时是否应删除该元素。 true/false
isPrintInFirstWholeBand 指定是否必须在整个带区中打印元素,即不在报表页或列之间划分的带区。 true/false
isPrintWhenDetailOverFlows 指定当带区溢出到新页面或新列时是否打印元素。 true/false
printWhenGroupChanges 指定当指定的组更改时将打印元素。 一个字符串值。
forecolor 指定元素的前景色。 以 # 字符开头的十六进制 RGB 值,或以下预定义值之一:黑色、蓝色、青色、darkGray、灰色、绿色、lightGray、洋红色、橙色、粉红色、红色、黄色、白色。
backcolor 指定元素的背景颜色。 与前景色的有效值相同

4 JasperReports Section属性

以下是报告部分的属性:

高度属性

节的高度指定该特定节的高度(以像素为单位),在整个报表设计中非常重要。

报表打印表达式

一个布尔表达式,用于确定是否应打印该部分。

是否拆分

一个标志,代表该部分在当前页面不适合时是否允许拆分。如果为真,该部分将被转移到下一页。请注意,如果该部分不适合下一页,则无论标志的值如何,该部分都将被拆分。splitType可以采用以下值 -

  • splitType="Stretch:"  :拆分拉伸的内容。如果该部分在当前页面上延伸(如果可用空间小于声明的高度),则允许添加到原始高度的区域拆分到下一页。

  • splitType="Prevent:"在第一次尝试时防止拆分。如果该部分不适合下一页,则拆分正常发生,因为带拆分防止仅在第一次拆分尝试时有效。

  • splitType="Immediate:":立即拆分。乐队可以在任何地方分裂,除了上面的最顶层元素。

3 JasperReports 报表组成结构量的示例

本案例中,为了演示每个报表的各个组成部分,我们编写报告模板(jasper_report_template.jrxml),在这个文件中,我们将在报表每个部分中输出一个文本(我们在上面讨论过)。

项目结构如下:

pom.xml文件

<dependencies>
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
        </dependency>
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.7</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
    </dependencies>

jasper_report_template.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 = "jasper_report_template" pageWidth = "300" pageHeight = "300" 
   columnWidth = "300" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0" >

   <title>
      <band height = "50">
         
         <textField>
            <reportElement x = "100" y = "16" width = "100" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Title"]]>
            </textFieldExpression>
        
         </textField>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "40">
         
         <textField>
            <reportElement  mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20"/>
            
            <textElement>
               <font isBold = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Page Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "40">
            
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            
            <textElement>
               <font isItalic = "true"/>
            </textElement>
            
            <textFieldExpression>
               <![CDATA["Column Header"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnHeader>
   
   <detail>
      <band height ="40">
         
         <textField>
            <reportElement mode = "Opaque" x = "100" y = "10" 
               width = "90" height = "20" backcolor = "#99CCFF"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Report Details"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Column Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </columnFooter>
   
   <pageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </pageFooter>
   
   <lastPageFooter>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Last Page Footer"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </lastPageFooter>
   
   <summary>
      <band height = "40">
         
         <textField>
            <reportElement  x = "100" y = "10" width = "90" height = "20"/>
            <textElement/>
            
            <textFieldExpression>
               <![CDATA["Summary"]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </summary>
	
</jasperReport>

先编译报表文件:

package cn.xnip;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer;

public class JasperReportFill {

   public static void main(String[] args) {
      String filePath = "D:/idea_codes/jasper_reports/jasper_report_template.jrxml";
      try {
         JasperCompileManager.compileReportToFile(filePath,"d:/jasper_report_template.jasper");
         System.out.println("编译成功");
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

编译后在D:/盘根目录下生成jasper_report_template.jasper文件,然后再填充数据:

package cn.xnip;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.view.JasperViewer;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class JasperReportFill {

   public static void main(String[] args) {
      String sourceFileName = "d:/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
              new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile(
                 sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

填充数据完毕后,在D:/盘根目录下生成jasper_report_template.jrprint文件,最后使用预览程序预览:

package cn.xnip;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.view.JasperViewer;

public class JasperReportFill {

   public static void main(String[] args) {
      String filePath = "D:/jasper_report_template.jrprint";
      try {
         JasperViewer.viewReport(filePath,false);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

最后输出结果如下:

从效果我们看到,在每个报表部分中都打印了文本。需要注意的是,由于JRXML 包含一个<lastPageFooter> 元素,它将显示在报告的最后一页,而不是显示在<pageFooter> 元素中。<columnHeader> 和 <columnFooter> 元素只会显示在报表上,如果它有不止一列。