Style raportów

JasperReports ma funkcję <style>, która pomaga kontrolować właściwości tekstu w szablonie raportu. Ten element to zbiór ustawień stylów zadeklarowanych na poziomie raportu. Właściwości, takie jak kolor pierwszego planu, kolor tła, czy czcionka jest pogrubiona, kursywa czy normalna, rozmiar czcionki, obramowanie czcionki i wiele innych atrybutów są kontrolowane przez element <style>. Style mogą rozszerzać inne style, a także dodawać lub zastępować właściwości stylu macierzystego.

Właściwości stylu

Element <style> ma wiele atrybutów. Niektóre z najczęściej używanych są wymienione w poniższej tabeli -

S.NO Atrybut i opis
1

name

Jest obowiązkowe. Musi być unikalny, ponieważ odwołuje się do odpowiedniego stylu raportu w całym raporcie.

2

isDefault

Wskazuje, czy ten styl jest domyślnym stylem dokumentu.

3

style

Jest odniesieniem do stylu rodzica.

4

mode

Określa przezroczystość elementu. Możliwe wartości to Nieprzezroczyste i Przezroczyste .

5

forecolor

Jest kolorem pierwszego planu obiektu.

6

backcolor

Jest kolorem tła obiektu.

7

fill

Określa wzór wypełnienia używany do wypełnienia obiektu. W tej chwili jedyną dozwoloną wartością jest Solid .

6

radius

Określa promień łuku narożnego prostokąta.

7

scaleImage

Określa skalę tylko dla obrazów. Możliwe wartości: Clip, FillFrame, RetainShape, RealHeight i RealSize .

8

hAlign

Określa wyrównanie w poziomie. Możliwe wartości: Left, Center, Right i Justified .

9

vAlign

Określa wyrównanie w pionie. Możliwe wartości: Top, Middle i Bottom .

10

rotation

Określa obrót elementu. Możliwe wartości: None, Left, Right i UpsideDown .

11

lineSpacing

Określa odstępy między wierszami tekstu. Możliwe wartości: Single, 1_1_2, Double .

12

markup

Określa styl znaczników dla tekstów ze stylami.

13

fontName

Określa nazwę czcionki.

14

fontSize

Określa rozmiar czcionki.

15

isBold

Wskazuje, czy styl czcionki jest pogrubiony.

16

isItalic

Wskazuje, czy styl czcionki jest kursywą.

17

isUnderline

Wskazuje, czy styl czcionki jest podkreślony.

18

isStrikeThrough

Wskazuje, czy styl czcionki jest przekreślony.

19

pdfFontName

Określa nazwę powiązanej czcionki PDF.

20

pdfEncoding

Określa kodowanie znaków dla formatu wyjściowego PDF.

22

isPdfEmbedded

Wskazuje, czy czcionka PDF jest osadzona.

23

pattern

Określa wzorzec formatu tekstów sformatowanych.

24

isBlankWhenNull

Wskazuje, czy pusty ciąg (biały znak) powinien być wyświetlany, jeśli wynikiem wyrażenia jest null.

Style warunkowe

W niektórych sytuacjach styl należy stosować tylko wtedy, gdy spełniony jest określony warunek (na przykład w celu zmiany kolorów sąsiednich wierszy w sekcji szczegółów raportu). Można to osiągnąć za pomocą stylów warunkowych.

Styl warunkowy ma dwa elementy -

  • wyrażenie warunkowe typu Boolean
  • styl

Styl jest używany tylko wtedy, gdy wynikiem warunku jest prawda .

Stosowanie stylów do elementów raportu

Każdy typ elementu raportu może odwoływać się do definicji stylu raportu za pomocą atrybutu style. Dlatego wszystkie właściwości stylu zadeklarowane w definicji stylu, które mają zastosowanie do bieżącego elementu, zostaną odziedziczone. Aby nadpisać odziedziczone wartości, można użyć właściwości stylu określonych na poziomie elementu raportu.

Szablony stylu

Możemy stworzyć zestaw raportów o wspólnym wyglądzie definiując styl we wspólnym miejscu. Szablony raportów mogą następnie odwoływać się do tego wspólnego szablonu stylu. Szablon stylu to plik XML zawierający jedną lub więcej definicji stylów. Pliki szablonów stylów używane zgodnie z konwencją*.jrtx rozszerzenie, ale nie jest to obowiązkowe.

Szablon stylu zawiera następujące elementy -

  • <jasperTemplate> - jest to główny element pliku szablonu stylu.

  • <template> - ten element służy do dołączania odniesień do innych plików szablonów. Zawartość tego elementu jest interpretowana jako lokalizacja wskazanego pliku szablonu.

  • <styl> - ten element jest identyczny z elementem o tej samej nazwie z szablonów projektów raportów (plików JRXML), z wyjątkiem tego, że styl w szablonie stylu nie może zawierać stylów warunkowych. To ograniczenie jest spowodowane faktem, że style warunkowe obejmują wyrażenia raportu, a wyrażenia mogą być interpretowane tylko w kontekście jednej definicji raportu.

Odniesienia do szablonów stylów są zawarte w raportach JRXML jako elementy <template>. Szablony stylów są ładowane w czasie wypełniania raportu, a odniesienia do nazw stylów są rozwiązywane po załadowaniu wszystkich szablonów. Podczas wczytywania szablonów stylów i przekształcania nazw stylów na style tworzone jest drzewo / wykres szablonów stylów, którego wierzchołek stanowi zestaw stylów zdefiniowanych w raporcie. W tym drzewie odniesienia do nazw stylów są rozwiązywane do ostatniego stylu, który pasuje do nazwy w przechodzeniu do pierwszej głębokości.

Przykład

Wypróbujmy style warunkowe i szablony stylów. Dodajmy <style> element alternateStyledo naszego istniejącego szablonu raportu (Chapter Report Designs ). W zależności od warunku kolor czcionki zmienia się na niebieski, aby uzyskać równomierną liczbę. Dołączyliśmy również szablon stylu"styles.jrtx". Zmieniony szablon raportu (jasper_report_template.jrxml) jest następujący. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test -

<?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>

Zawartość szablonu stylu styles.jrtxsą następujące. Zapisz go w katalogu C: \ tools \ jasperreports-5.0.1 \ test.

<?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>

Kody java do wypełniania raportów pozostają niezmienione. Zawartość plikuC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java są jak podano poniżej -

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

Zawartość pliku POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java są jak poniżej -

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

Zawartość pliku C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java są jak poniżej -

package com.tutorialspoint;

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

Generowanie raportów

Skompilujemy i uruchomimy powyższy plik przy użyciu naszego zwykłego procesu budowania ANT. Zawartość pliku build.xml (zapisanego w katalogu C: \ tools \ jasperreports-5.0.1 \ test) jest taka, jak podano poniżej.

Plik importu - baseBuild.xml jest pobierany z rozdziału Konfiguracja środowiska i powinien być umieszczony w tym samym katalogu, co plik build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
   <import file = "baseBuild.xml" />
   
   <target name = "viewFillReport" depends = "compile,compilereportdesing,run"
      description = "Launches the report viewer to preview the 
      report stored in the .JRprint file.">
      
      <java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
         <arg value = "-F${file.name}.JRprint" />
         <classpath refid = "classpath" />
      </java>
		
   </target>
   
   <target name = "compilereportdesing" description = "Compiles the JXML file and
      produces the .jasper file.">
      
      <taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
         <classpath refid = "classpath" />
      </taskdef>
      
      <jrc destdir = ".">
         <src>
            <fileset dir = ".">
               <include name = "*.jrxml" />
            </fileset>
         </src>
         <classpath refid = "classpath" />
      </jrc>
		
   </target>

</project>

Następnie otwórzmy okno wiersza poleceń i przejdźmy do katalogu, w którym znajduje się plik build.xml. Na koniec wykonaj polecenieant -Dmain-class=com.tutorialspoint.JasperReportFill (domyślnym celem jest viewFullReport) jako -

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
   [delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint

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 build.sysclasspath=last;
   set to false for repeatable builds
   [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.

W wyniku powyższej kompilacji otworzy się okno JasperViewer, jak pokazano na poniższym ekranie -

Tutaj widzimy, że kolor czcionki zmienia się na niebieski dla równej liczby (w kraju kolumny). W nazwie kolumny kolor czcionki jest zmieniany na zielony (odwołanie do tego stylu pochodzi z szablonu stylu).