Stili di report

JasperReports ha una funzione <style> che aiuta a controllare le proprietà del testo in un modello di report. Questo elemento è una raccolta di impostazioni di stile dichiarate a livello di report. Proprietà come il colore di primo piano, il colore di sfondo, se il carattere è in grassetto, corsivo o normale, la dimensione del carattere, un bordo per il carattere e molti altri attributi sono controllati dall'elemento <style>. Gli stili possono estendere altri stili e aggiungere o sovrascrivere anche le proprietà dello stile principale.

Proprietà dello stile

Un elemento <style> ha molti attributi. Alcuni dei più comunemente usati sono elencati nella tabella riportata di seguito:

S.NO Attributo e descrizione
1

name

È obbligatorio. Deve essere univoco perché fa riferimento allo stile di report corrispondente in tutto il report.

2

isDefault

Indica se questo stile è lo stile predefinito del documento.

3

style

È un riferimento allo stile genitore.

4

mode

Specifica la trasparenza dell'elemento. I valori possibili sono Opaco e Trasparente .

5

forecolor

È il colore di primo piano dell'oggetto.

6

backcolor

È il colore di sfondo dell'oggetto.

7

fill

Determina il motivo di riempimento utilizzato per riempire l'oggetto. Al momento, l'unico valore consentito è Solid .

6

radius

Specifica il raggio dell'arco d'angolo del rettangolo.

7

scaleImage

Specifica la scala solo per le immagini. Valori possibili: Clip, FillFrame, RetainShape, RealHeight e RealSize .

8

hAlign

Specifica l'allineamento orizzontale. Valori possibili: Left, Center, Right e Justified .

9

vAlign

Specifica l'allineamento verticale. Valori possibili: Top, Middle e Bottom .

10

rotation

Specifica la rotazione dell'elemento. Valori possibili: Nessuno, Sinistra, Destra e UpsideDown .

11

lineSpacing

Specifica la spaziatura tra le righe di testo. Valori possibili: Single, 1_1_2, Double .

12

markup

Specifica lo stile di markup per i testi con stile.

13

fontName

Specifica il nome del carattere.

14

fontSize

Specifica la dimensione del carattere.

15

isBold

Indica se lo stile del carattere è in grassetto.

16

isItalic

Indica se lo stile del carattere è corsivo.

17

isUnderline

Indica se lo stile del carattere è sottolineato.

18

isStrikeThrough

Indica se lo stile del carattere è barrato.

19

pdfFontName

Specifica il nome del font PDF correlato.

20

pdfEncoding

Specifica la codifica dei caratteri per il formato di output PDF.

22

isPdfEmbedded

Indica se il font PDF è incorporato.

23

pattern

Specifica il modello di formato per i testi formattati.

24

isBlankWhenNull

Indica se deve essere visualizzata una stringa vuota (spazio bianco) se l'espressione restituisce null.

Stili condizionali

In alcune situazioni, uno stile dovrebbe essere applicato solo quando viene soddisfatta una determinata condizione (ad esempio, per alternare i colori delle righe adiacenti in una sezione dei dettagli del report). Ciò può essere ottenuto utilizzando stili condizionali.

Uno stile condizionale ha due elementi:

  • un'espressione di condizione booleana
  • uno stile

Lo stile viene utilizzato solo se la condizione restituisce true .

Applicazione di stili agli elementi del report

Qualsiasi tipo di elemento di report può fare riferimento a una definizione di stile di report utilizzando l'attributo style. Quindi, tutte le proprietà di stile dichiarate dalla definizione di stile che sono applicabili all'elemento corrente verranno ereditate. Per sostituire i valori ereditati, è possibile utilizzare le proprietà di stile specificate a livello di elemento del report.

Modelli di stile

Possiamo creare una serie di report con un aspetto comune definendo lo stile in un luogo comune. Questo modello di stile comune può quindi essere referenziato dai modelli di report. Un modello di stile è un file XML che contiene una o più definizioni di stile. File modello di stile utilizzati per convenzione i file*.jrtx estensione, ma questo non è obbligatorio.

Un modello di stile contiene i seguenti elementi:

  • <jasperTemplate> - Questo è l'elemento radice di un file modello di stile.

  • <template> : questo elemento viene utilizzato per includere riferimenti ad altri file modello. Il contenuto di questo elemento viene interpretato come la posizione del file modello di riferimento.

  • <style> - Questo elemento è identico all'elemento con lo stesso nome dai modelli di progettazione di report (file JRXML), con l'eccezione che uno stile in un modello di stile non può contenere stili condizionali. Questa limitazione è causata dal fatto che gli stili condizionali coinvolgono espressioni di report e le espressioni possono essere interpretate solo nel contesto di una singola definizione di report.

I riferimenti ai modelli di stile sono inclusi nei report JRXML come elementi <template>. I modelli di stile vengono caricati al momento del riempimento del rapporto e i riferimenti ai nomi di stile vengono risolti una volta caricati tutti i modelli. Quando si caricano i modelli di stile e si risolvono i nomi di stile in stili, viene creato un albero / grafico di modelli di stile, la parte superiore dell'albero è l'insieme di stili definiti nel report. In questo albero, i riferimenti al nome dello stile vengono risolti all'ultimo stile che corrisponde al nome in un attraversamento in profondità.

Esempio

Proviamo gli stili condizionali e i modelli di stile. Aggiungiamo il <style> elemento alternateStyleal nostro modello di report esistente (Chapter Report Designs ). In base alla condizione, il colore del carattere diventa blu per un conteggio uniforme. Abbiamo incluso anche un modello di stile"styles.jrtx". Il modello di report rivisto (jasper_report_template.jrxml) è il seguente. Salvalo nella directory 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>

Il contenuto del modello di stile styles.jrtxsono come segue. Salvalo nella directory 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>

I codici java per la compilazione del report rimangono invariati. Il contenuto del fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sono come indicato di seguito -

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

Il contenuto del file POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sono come sotto -

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

Il contenuto del file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sono come sotto -

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

Generazione di report

Compileremo ed eseguiremo il file sopra utilizzando il nostro normale processo di compilazione ANT. I contenuti del file build.xml (salvato nella directory C: \ tools \ jasperreports-5.0.1 \ test) sono i seguenti.

Il file di importazione - baseBuild.xml viene prelevato dal capitolo Configurazione dell'ambiente e dovrebbe essere posizionato nella stessa directory di 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>

Quindi, apriamo la finestra della riga di comando e andiamo alla directory in cui si trova build.xml. Infine, esegui il comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport è il target predefinito) come -

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.

Come risultato della compilazione di cui sopra, si apre una finestra di JasperViewer come mostrato nella schermata sotto riportata -

Qui, possiamo vedere che il colore del carattere è cambiato in blu per il conteggio pari (nel paese della colonna). Nel nome della colonna, il colore del carattere viene modificato in verde (questo stile è referenziato dal modello di stile).