📜  JasperReports-交叉表

📅  最后修改于: 2020-11-16 08:10:23             🧑  作者: Mango


交叉表(cross-tabulation)报告是包含表格的报表,这些表格以表格形式在行和列之间排列数据。交叉表对象用于在主报表中插入交叉表报表。交叉表可用于任何级别的数据(标称,有序,区间或比率),并且通常以动态表的形式显示报告变量中包含的汇总数据。变量用于显示汇总数据,例如总和,计数,平均值。

交叉表属性

JRXML元素< crosstab >用于将交叉表插入到报表中。

属性

以下是< crosstab >元素的属性列表-

  • isRepeatColumnHeaders-指示是否应在分页符后重新打印列标题。默认值为true

  • isRepeatRowHeaders-指示在交叉表列中断后是否应重新打印行标题。默认值为true

  • columnBreakOffset-发生分栏时,表示在将后续交叉表放置在同一页面上的前一个交叉表之前的垂直空间量(以像素为单位)。预设值为10。

  • runDirection-指示交叉表数据应从左到右(LTR)还是从右到左(RTL)填充。默认值为LTR。

  • ignoreWidth-指示交叉表是否会超出初始交叉表宽度限制,并且不会生成分栏符。否则,它将停止呈现交叉表宽度限制内的列,并仅在所有行开始呈现后才继续其余列。默认值为false

子元素

元素具有以下子元素-

  • -此元素定义交叉表在其包围中的位置,宽度和高度。此元素的属性包括所有标准属性。

  • -此元素用于从交叉表内部访问报告变量和参数。该元素的属性包括-

    • 名称-这定义了参数名称。

    • class-这表示参数类别。

  • -此元素用于传递报告变量或包含java.util.Map实例的参数,作为交叉表的一组参数。该元素不包含任何属性。

  • -此元素定义用于填充交叉表的数据集(有关详细说明,请参阅下一节)。该元素的属性包括-

    • isDataPreSorted-指示数据集中的数据是否已预先排序。默认值为false

  • -此元素定义在列表头和行头相交的交叉表左上角找到的区域的内容。该单元格的大小是根据定义的行和列的宽度和高度自动计算的。

  • -此元素定义用于将数据拆分为行的组。该元素的属性包括-

    • name-这定义行组的名称。

    • width-这定义了行组的宽度。

    • headerPosition-定义标题内容的位置(顶部,中间,底部,拉伸)。

    • totalPosition-这定义了整个列的位置(开始,结束,无)。

    该元素包含以下子元素-

    • <桶>

  • -此元素定义用于将数据拆分为列的组。该元素的属性包括-

    • 名称-这定义了列组名称。

    • height-定义列组标题的高度。

    • headerPosition-定义标题内容的位置( Right,Left,Center,Stretch )。

    • totalPosition-定义整个列的位置( Start,End,None )。

    该元素包含以下子元素-

    • <桶>

  • -此元素定义要在行和列之间执行的计算。该元素的属性包括-

    • 名称-这定义了度量名称。

    • class-这表示度量等级。

    • 计算-这表示要在交叉表单元格值之间执行的计算。它的值可以是以下任意值-Nothing,Count,DistinctCount,Sum,Average,Lowest,Highest,StandardDeviation,VarianceFirst 。默认值为Nothing

  • -此元素定义如何布置非标题单元格中的数据。该元素的属性包括-

    • columnTotalGroup-这表示用于计算列总数的组。

    • height-这定义了单元格的高度。

    • rowTotalGroup-这表示用于计算行总数的组。

    • width-这定义了单元格的宽度。

  • -此元素定义在空白交叉表单元格上显示的内容。该元素不包含任何属性。

交叉表中的数据分组

交叉表计算引擎通过迭代关联的数据集记录来聚合数据。为了聚合数据,首先需要将它们分组。在交叉表中,行和列基于特定的组项目(称为buckets) 。值区定义应包含-

  • bucketExpression-为了获得数据组项目而要评估的表达式。

  • 比较器表达式-在值的自然排序不是最佳选择的情况下需要。

  • orderByExpression-指示用于排序数据的值。

交叉表中的行和列组(如上定义)依赖于buckets

内置交叉表总计变量

以下是度量的当前值列表,可以通过根据以下方案命名的变量访问与该单元格对应的不同级别的总计-

  • 度量计算的当前值存储在与度量同名的变量中。

  • _ _ALL-这将得出同一行中列组中所有条目的总数。

  • _ _ALL-这将得出同一列中行组中所有条目的总数。

  • _ _ _ALL-这将产生与行和列组中所有条目相对应的合并总数。

为了演示交叉表,让我们编写一个新的报告模板(jasper_report_template.jrxml)。在这里,我们将交叉表添加到摘要部分。将其保存到目录C:\ tools \ jasperreports-5.0.1 \ test 。该文件的内容如下所示-




    


   
   
   
   
   
   
   
      <band height="70">
         
         <line>
            <reportelement x="0" y="0" width="515" height="1"></reportelement>
         </line>
         
         <textfield isblankwhennull="true" bookmarklevel="1">
            <reportelement x="0" y="10" width="515" height="30"></reportelement>
            
            <textelement textalignment="Center">
               <font size="22"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
            
            <anchornameexpression>
               
            </anchornameexpression>
         </textfield>
         
         <textfield isblankwhennull="true">
            <reportelement x="0" y="40" width="515" height="20"></reportelement>
            
            <textelement textalignment="Center">
               <font size="10"></font>
            </textelement>
            
            <textfieldexpression class="java.lang.String">
               
            </textfieldexpression>
         </textfield>
      
      </band>
   
   
   
      
      
      
         
          
         
         
            
               
                  
               
            
            
            
            
               
                  
                  
                  
                     
                     
                     
                     
                        
                     
                  
            
               
         
            

         
         
         
            
               
               
                  $F{country}
               
            
            
            
               
                  
                  
                     
                     
                     
                        
                     
                  
               
            

         
         
         
            $F{country}
         
         
         
            
               
               
                  
                  
                  
                      $V{tailNumCount}
                  
               
            
         
      
      
      
      
   
    

上述文件的详细信息如下-

  • 交叉表由元素定义。

  • 元素定义了一个组,用于将数据拆分为行。在这里,每一行将显示不同名称的数据。

  • 元素定义将哪些报表表达式用作的组定界符。在这里,我们使用名称字段作为分隔符,以便按名称拆分行。

  • 元素定义用作行标题的表达式。它包含一个子元素,即,其作用类似于交叉表中的内部带。我们没有为内的文本字段定义变量名,而是将名称分配给了(通过其name属性),因此它创建了一个隐式变量。 元素定义整个行的标题单元格的内容。它仅将一个元素作为其唯一子元素。

  • 元素及其子元素类似于元素,不同之处在于它影响列而不是行。

  • 元素定义要在行和列之间执行的计算。计算属性设置为Count

  • 元素定义如何布置非标题单元格中的数据。此元素还包含一个元素作为其唯一的子元素。

用于报告填充的Java代码保持不变。文件C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ JasperReportFill.java的内容如下-

package com.tutorialspoint;

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

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

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

POJO文件C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ DataBean.java的内容如下-

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

文件C:\ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ DataBeanList.java的内容如下-

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList getDataBeanList() {
      ArrayList dataBeanList = new ArrayList();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

报告生成

接下来,让我们使用常规的ANT构建过程来编译并执行上述文件。文件build.xml的内容(保存在目录C:\ tools \ jasperreports-5.0.1 \ test下)如下所示。

导入文件-baseBuild.xml是从“环境设置”一章中提取的,应与build.xml放在同一目录中。



   
   
   
      
      
         
         
      
   
   
   
      
      
         
      
      
      
         
            
               
            
         
         
      
        
   
    

接下来,让我们打开命令行窗口并转到build.xml所在的目录。最后,执行以下命令ant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport是默认目标)-

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper

compile:
   [mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
   [javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
   warning: 'includeantruntime' was not set, defaulting to
   [javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes

compilereportdesing:
   [jrc] Compiling 1 report design files.
   [jrc] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
   [jrc] log4j:WARN Please initialize the log4j system properly.
   [jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig 
      for more info.
   [jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger (
   net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

经过上述编译,JasperViewer窗口打开,如下图所示:

Jasper报表交叉表示例

在这里,我们看到每个国家和名称都被列表了。