Estilos de informe
JasperReports tiene una función <style> que ayuda a controlar las propiedades del texto en una plantilla de informe. Este elemento es una colección de configuraciones de estilo declaradas a nivel de informe. Propiedades como el color de primer plano, el color de fondo, si la fuente es negrita, cursiva o normal, el tamaño de fuente, un borde para la fuente y muchos otros atributos están controlados por el elemento <style>. Los estilos pueden ampliar otros estilos y agregar o anular propiedades del estilo principal también.
Propiedades de estilo
Un elemento <style> tiene muchos atributos. Algunos de los más utilizados se enumeran en la tabla siguiente:
S.NO | Atributo y descripción |
---|---|
1 | name Es obligatorio. Debe ser único porque hace referencia al estilo de informe correspondiente en todo el informe. |
2 | isDefault Indica si este estilo es el estilo predeterminado del documento. |
3 | style Es una referencia al estilo padre. |
4 | mode Especifica la transparencia del elemento. Los valores posibles son Opaco y Transparente . |
5 | forecolor Es el color de primer plano del objeto. |
6 | backcolor Es el color de fondo del objeto. |
7 | fill Determina el patrón de relleno utilizado para rellenar el objeto. Por el momento, el valor único permitido es Sólido . |
6 | radius Especifica el radio del arco de la esquina del rectángulo. |
7 | scaleImage Especifica la escala solo para las imágenes. Valores posibles: Clip, FillFrame, RetainShape, RealHeight y RealSize . |
8 | hAlign Especifica la alineación horizontal. Valores posibles: Izquierda, Centro, Derecha y Justificado . |
9 | vAlign Especifica la alineación vertical. Valores posibles: Superior, Medio e Inferior . |
10 | rotation Especifica la rotación del elemento. Valores posibles: Ninguno, Izquierda, Derecha y UpsideDown . |
11 | lineSpacing Especifica el espaciado de línea entre líneas de texto. Valores posibles: Single, 1_1_2, Double . |
12 | markup Especifica el estilo de marcado para textos con estilo. |
13 | fontName Especifica el nombre de la fuente. |
14 | fontSize Especifica el tamaño de la fuente. |
15 | isBold Indica si el estilo de fuente está en negrita. |
dieciséis | isItalic Indica si el estilo de fuente es cursiva. |
17 | isUnderline Indica si el estilo de fuente está subrayado. |
18 | isStrikeThrough Indica si el estilo de la fuente está tachado. |
19 | pdfFontName Especifica el nombre de la fuente PDF relacionada. |
20 | pdfEncoding Especifica la codificación de caracteres para el formato de salida PDF. |
22 | isPdfEmbedded Indica si la fuente PDF está incrustada. |
23 | pattern Especifica el patrón de formato para textos formateados. |
24 | isBlankWhenNull Indica si se debe mostrar una cadena vacía (espacios en blanco) si la expresión se evalúa como nula. |
Estilos condicionales
En algunas situaciones, un estilo debe aplicarse solo cuando se cumpla cierta condición (por ejemplo, para alternar colores de filas adyacentes en una sección de detalles de informe). Esto se puede lograr utilizando estilos condicionales.
Un estilo condicional tiene dos elementos:
- una expresión de condición booleana
- un estilo
El estilo se usa solo si la condición se evalúa como verdadera .
Aplicar estilos a elementos de informe
Cualquier tipo de elemento de informe puede hacer referencia a una definición de estilo de informe mediante el atributo de estilo. Por lo tanto, se heredarán todas las propiedades de estilo declaradas por la definición de estilo que sean aplicables al elemento actual. Para anular los valores heredados, se pueden utilizar las propiedades de estilo especificadas en el nivel del elemento del informe.
Plantillas de estilo
Podemos hacer un conjunto de informes con un aspecto común definiendo el estilo en un lugar común. A continuación, las plantillas de informes pueden hacer referencia a esta plantilla de estilo común. Una plantilla de estilo es un archivo XML que contiene una o más definiciones de estilo. Archivos de plantilla de estilo utilizados por convención*.jrtx extensión, pero esto no es obligatorio.
Una plantilla de estilo contiene los siguientes elementos:
<jasperTemplate> : este es el elemento raíz de un archivo de plantilla de estilo.
<template> : este elemento se utiliza para incluir referencias a otros archivos de plantilla. El contenido de este elemento se interpreta como la ubicación del archivo de plantilla referido.
<style> : este elemento es idéntico al elemento con el mismo nombre de las plantillas de diseño de informes (archivos JRXML), con la excepción de que un estilo en una plantilla de estilo no puede contener estilos condicionales. Esta limitación se debe al hecho de que los estilos condicionales implican expresiones de informe y las expresiones solo se pueden interpretar en el contexto de una única definición de informe.
Las referencias a las plantillas de estilo se incluyen en los informes JRXML como elementos <template>. Las plantillas de estilo se cargan cuando se completa el informe y las referencias a los nombres de estilo se resuelven una vez que se han cargado todas las plantillas. Cuando se cargan plantillas de estilo y se resuelven nombres de estilos en estilos, se crea un árbol / gráfico de plantillas de estilo, siendo la parte superior del árbol el conjunto de estilos definido en el informe. En este árbol, las referencias al nombre de estilo se resuelven hasta el último estilo que coincide con el nombre en un recorrido en profundidad.
Ejemplo
Probemos los estilos condicionales y las plantillas de estilo. Agreguemos el <style> elemento alternateStylea nuestra plantilla de informe existente ( Diseños de informe de capítulo ). Según la condición, el color de la fuente cambia a azul para un recuento uniforme. También hemos incluido una plantilla de estilo"styles.jrtx". La plantilla de informe revisada (jasper_report_template.jrxml) es la siguiente. Guárdelo en el directorio 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>
El contenido de la plantilla de estilo styles.jrtxson como sigue. Guárdelo en el directorio 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>
Los códigos Java para el llenado de informes permanecen sin cambios. El contenido del archivoC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java son los que se indican a continuación:
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();
}
}
}
El contenido del archivo POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java son los siguientes:
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;
}
}
El contenido del archivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java son los siguientes:
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;
}
}
La generación del informe
Compilaremos y ejecutaremos el archivo anterior utilizando nuestro proceso de compilación ANT habitual. El contenido del archivo build.xml (guardado en el directorio C: \ tools \ jasperreports-5.0.1 \ test) se muestra a continuación.
El archivo de importación, baseBuild.xml, se obtiene del capítulo Configuración del entorno y debe colocarse en el mismo directorio que 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 continuación, abramos la ventana de la línea de comandos y vayamos al directorio donde se coloca build.xml. Finalmente, ejecute el comandoant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport es el destino predeterminado) 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 de la compilación anterior, se abre una ventana de JasperViewer como se muestra en la pantalla que se muestra a continuación:
Aquí, podemos ver que el color de la fuente cambia a azul para un recuento par (en el país de la columna). En el nombre de la columna, el color de la fuente cambia a verde (se hace referencia a este estilo desde la plantilla de estilo).