Estilos de relatório

JasperReports tem um recurso <style> que ajuda a controlar as propriedades do texto em um modelo de relatório. Este elemento é uma coleção de configurações de estilo declaradas no nível do relatório. Propriedades como cor de primeiro plano, cor de fundo, se a fonte é negrito, itálico ou normal, o tamanho da fonte, uma borda para a fonte e muitos outros atributos são controlados pelo elemento <style>. Os estilos podem estender outros estilos e adicionar ou substituir propriedades do estilo pai.

Propriedades de estilo

Um elemento <style> possui muitos atributos. Alguns dos mais comumente usados ​​estão listados na tabela abaixo -

S.NO Atributo e descrição
1

name

É mandatório. Deve ser exclusivo porque faz referência ao estilo de relatório correspondente em todo o relatório.

2

isDefault

Indica se este estilo é o estilo padrão do documento.

3

style

É uma referência ao estilo pai.

4

mode

Especifica a transparência do elemento. Os valores possíveis são Opaco e Transparente .

5

forecolor

É a cor de primeiro plano do objeto.

6

backcolor

É a cor de fundo do objeto.

7

fill

Determina o padrão de preenchimento usado para preencher o objeto. No momento, o único valor permitido é Solid .

6

radius

Especifica o raio do arco do canto do retângulo.

7

scaleImage

Especifica a escala apenas para as imagens. Valores possíveis: Clip, FillFrame, RetainShape, RealHeight e RealSize .

8

hAlign

Especifica o alinhamento horizontal. Valores possíveis: Esquerda, Centro, Direita e Justificado .

9

vAlign

Especifica o alinhamento vertical. Valores possíveis: Top, Middle e Bottom .

10

rotation

Especifica a rotação do elemento. Valores possíveis: Nenhum, Esquerda, Direita e UpsideDown .

11

lineSpacing

Especifica o espaçamento de linha entre as linhas de texto. Valores possíveis: Single, 1_1_2, Double .

12

markup

Especifica o estilo de marcação para textos estilizados.

13

fontName

Especifica o nome da fonte.

14

fontSize

Especifica o tamanho da fonte.

15

isBold

Indica se o estilo da fonte está em negrito.

16

isItalic

Indica se o estilo da fonte é itálico.

17

isUnderline

Indica se o estilo da fonte está sublinhado.

18

isStrikeThrough

Indica se o estilo da fonte é tachado.

19

pdfFontName

Especifica o nome da fonte do PDF relacionado.

20

pdfEncoding

Especifica a codificação de caracteres para o formato de saída PDF.

22

isPdfEmbedded

Indica se a fonte do PDF está incorporada.

23

pattern

Especifica o padrão de formato para textos formatados.

24

isBlankWhenNull

Indica se uma string vazia (espaço em branco) deve ser mostrada se a expressão for avaliada como nula.

Estilos Condicionais

Em algumas situações, um estilo deve ser aplicado apenas quando determinada condição for atendida (por exemplo, para alternar cores de linhas adjacentes em uma seção de detalhes do relatório). Isso pode ser alcançado usando estilos condicionais.

Um estilo condicional tem dois elementos -

  • uma expressão de condição booleana
  • um estilo

O estilo é usado apenas se a condição for avaliada como verdadeira .

Aplicação de estilos a elementos de relatório

Qualquer tipo de elemento de relatório pode fazer referência a uma definição de estilo de relatório usando o atributo style. Conseqüentemente, todas as propriedades de estilo declaradas pela definição de estilo que são aplicáveis ​​ao elemento atual serão herdadas. Para substituir os valores herdados, as propriedades de estilo especificadas no nível do elemento do relatório podem ser usadas.

Modelos de estilo

Podemos fazer um conjunto de relatórios com uma aparência comum, definindo o estilo em um lugar comum. Este modelo de estilo comum pode então ser referenciado pelos modelos de relatório. Um modelo de estilo é um arquivo XML que contém uma ou mais definições de estilo. Arquivos de modelo de estilo usados ​​pela convenção*.jrtx extensão, mas isso não é obrigatório.

Um modelo de estilo contém os seguintes elementos -

  • <jasperTemplate> - Este é o elemento raiz de um arquivo de modelo de estilo.

  • <template> - Este elemento é usado para incluir referências a outros arquivos de modelo. O conteúdo deste elemento é interpretado como a localização do arquivo de modelo referido.

  • <style> - este elemento é idêntico ao elemento com o mesmo nome dos modelos de design de relatório (arquivos JRXML), com a exceção de que um estilo em um modelo de estilo não pode conter estilos condicionais. Essa limitação é causada pelo fato de que os estilos condicionais envolvem expressões de relatório e as expressões só podem ser interpretadas no contexto de uma única definição de relatório.

Referências a modelos de estilo são incluídas em relatórios JRXML como elementos <template>. Os modelos de estilo são carregados no tempo de preenchimento do relatório e as referências de nome de estilo são resolvidas assim que todos os modelos forem carregados. Ao carregar modelos de estilo e resolver nomes de estilo para estilos, uma árvore / gráfico de modelos de estilo é criado, sendo o topo da árvore o conjunto de estilos definidos no relatório. Nesta árvore, as referências de nome de estilo são resolvidas para o último estilo que corresponde ao nome em uma travessia em profundidade.

Exemplo

Vamos experimentar os estilos condicionais e modelos de estilo. Vamos adicionar o <style> elemento alternateStyleao nosso modelo de relatório existente (Capítulo Report Designs ). Com base na condição, a cor da fonte muda para azul para contagem uniforme. Também incluímos um modelo de estilo"styles.jrtx". O modelo de relatório revisado (jasper_report_template.jrxml) é o seguinte. Salve-o no diretório 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>

O conteúdo do modelo de estilo styles.jrtxsão como segue. Salve-o no diretório 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>

Os códigos java para preenchimento de relatório permanecem inalterados. O conteúdo do arquivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java são os dados abaixo -

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

O conteúdo do arquivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java são como abaixo -

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

O conteúdo do arquivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java são como abaixo -

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

Geração de relatório

Vamos compilar e executar o arquivo acima usando nosso processo normal de construção ANT. O conteúdo do arquivo build.xml (salvo no diretório C: \ tools \ jasperreports-5.0.1 \ test) é fornecido a seguir.

O arquivo de importação - baseBuild.xml é obtido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório do 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>

A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport é o destino padrão) como -

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.

Como resultado da compilação acima, uma janela JasperViewer é aberta conforme mostrado na tela abaixo -

Aqui, podemos ver que a cor da fonte é alterada para azul para contagem par (no país da coluna). No nome da coluna, a cor da fonte é alterada para verde (este estilo é referenciado no modelo de estilo).