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

JasperReports 报表样式Style

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

JasperReports 有一个特性 <style> 可以帮助控制报表模板中的文本属性。此元素是在报表级别声明的样式设置的集合。诸如前景色、背景色、字体是粗体、斜体还是普通字体、字体大小、字体边框以及许多其他属性等属性都由 <style> 元素控制。样式可以扩展其他样式,也可以添加或覆盖父样式的属性。

JasperReports Style属性

<style> 元素有许多属性。下表列出了一些最常用的:

元素 描述
name 是必须的。它必须是唯一的,因为它在整个报告中引用了相应的报告样式。
isDefault 指示此样式是否为文档的默认样式。
style 是对父样式的引用。
mode 指定元素的透明度。可能的值为Opaque和Transparent。
forecolor 是对象的前景色。
backcolor 是对象的背景颜色。
fill 确定用于填充对象的填充图案。目前,允许的单个值是Solid。
radius 指定矩形角弧的半径。
scaleImage 仅指定图像的比例。可能的值:Clip、FillFrame、RetainShape、RealHeight和RealSize。
hAlign 指定水平对齐方式。可能的值:Left、Center、Right和Justified。
vAlign 指定垂直对齐方式。可能的值:顶部、中间和底部。
rotation 指定元素的旋转。可能的值:None、Left、Right和UpsideDown。
lineSpacing 指定文本行之间的行距。可能的值:单、1_1_2、双。
markup 指定样式文本的标记样式。
fontName 指定字体名称。
fontSize 指定字体大小。
isBold 指示字体样式是否为粗体。
isItalic 指示字体样式是否为斜体。
isUnderline 指示字体样式是否为下划线。
isStrikeThrough 指示字体样式是否为删除线。
pdfFontName 指定相关的 PDF 字体名称。
pdfEncoding 指定 PDF 输出格式的字符编码。
isPdfEmbedded 指示是否嵌入了 PDF 字体。
pattern 指定格式化文本的格式模式。
isBlankWhenNull 指示如果表达式的计算结果为空,是否应显示空字符串(空格)。

 JasperReports 条件样式

在某些情况下,仅当满足特定条件时才应用样式(例如,在报表详细信息部分中交替相邻行的颜色)。这可以使用条件样式来实现。

条件样式有两个元素 :

  • boolean条件表达式
  • style

仅当条件判断为true时才使用样式。

JasperReports 将样式应用于报表元素

任何类型的报告元素都可以使用 style 属性引用报告样式定义。因此,样式定义声明的所有适用于当前元素的样式属性都将被继承。要覆盖继承的值,可以使用在报表元素级别指定的样式属性。

JasperReports 样式模板

我们可以通过在一个共同的地方定义样式来制作一组具有共同外观的报表。然后,报表模板可以引用此通用样式模板。样式模板是包含一个或多个样式定义的 XML 文件。样式模板文件通常使用*.jrtx扩展名,但这不是强制性的。

样式模板包含以下元素 :

  • <jasperTemplate> : 这是样式模板文件的根元素。

  • <template> : 此元素用于包含对其他模板文件的引用。此元素的内容被解释为引用模板文件的位置。

  • <style> :此元素与报表设计模板(JRXML 文件)中的同名元素相同,但样式模板中的样式不能包含条件样式。此限制是由于条件样式涉及报表表达式,并且表达式只能在单个报表定义的上下文中解释这一事实造成的。

对样式模板的引用作为 <template> 元素包含在 JRXML 报告中。样式模板在报告填写时加载,并且在所有模板加载后解析样式名称引用。加载样式模板并将样式名称解析为样式时,会创建样式模板的树/图形,树的顶部是报告中定义的样式集。在这棵树上,样式名称引用被解析为深度优先遍历中与名称匹配的最后一个样式。

JasperReports 报表样式的示例

让我们试试条件样式和样式模板。让我们将 < style > 元素alternateStyle添加到我们现有的报表模板(JasperReports 模板设计)中。根据条件,字体颜色更改为蓝色以进行偶数计数。我们还包含了一个样式模板“styles.jrtx”。

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>

DataBean实体类:

package cn.xnip;

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;
   }
}

DataBeanList类:

package cn.xnip;

import java.util.ArrayList;

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

      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;
   }
}

jasper_report_template.jrxml模板文件:

<?xml version = "1.0"?>
<!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 = "jasper_report_template" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <template>"styles.jrtx"</template>
   
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]>
         </conditionExpression>
			
         <style forecolor = "blue" isBold = "true"/>
      </conditionalStyle>
   </style>
   
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <queryString>
      <![CDATA[]]>
   </queryString>

   <field name = "country" class = "java.lang.String">
      <fieldDescription><![CDATA[country]]></fieldDescription>
   </field>

   <field name = "name" class = "java.lang.String">
      <fieldDescription><![CDATA[name]]></fieldDescription>
   </field>

   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>

   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
				
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
         </textField>

         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>

   <columnHeader>
      <band height = "23">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "3" 
               width = "535" height = "15" backcolor = "#70A9A9" />
            
            <box>
               <bottomPen lineWidth = "1.0" lineColor = "#CCCCCC" />
            </box>
				
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
				
         </staticText>
         
         <staticText>
            <reportElement x = "414" y = "3" width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Country]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "3" width = "136" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font isBold = "true" />
            </textElement>
				
            <text><![CDATA[Name]]></text>
         </staticText>
      
      </band>
   </columnHeader>

   <detail>
      <band height = "16">
         
         <staticText>
            <reportElement mode = "Opaque" x = "0" y = "0" 
               width = "535" height = "14" backcolor = "#E5ECF9" />
            
            <box>
               <bottomPen lineWidth = "0.25" lineColor = "#CCCCCC" />
            </box>
            
            <textElement />
				
            <text>
               <![CDATA[]]>
            </text>
				
         </staticText>
         
         <textField>
            <reportElement style = "alternateStyle" x = "414" y = "0" 
               width = "121" height = "15" />
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font size = "9" />
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <textField>
            <reportElement x = "0" y = "0" width = "136" height = "15" 
               style = "Strong"/>
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

样式模板styles.jrtx的内容如下:

<?xml version="1.0"?>
<!DOCTYPE jasperTemplate
  PUBLIC "-//JasperReports//DTD Template//EN"
  "http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">

<jasperTemplate>
    <style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold" backcolor = "lightGray" forecolor = "green"/>
</jasperTemplate>

先编译报表文件:

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 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();
      /**
       * 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();
      }
   }
}

填充数据完毕后,在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();
      }
   }
}

最后输出结果如下:

在这里,我们可以看到,对于偶数计数(在列国家/地区),字体的颜色更改为蓝色。