Secciones de informe
Discutimos la estructura de una plantilla de informe simple en el capítulo Introducción . En líneas similares, JasperReports estructura la plantilla de informe en varias secciones. Las secciones son partes del informe que tienen una altura especificada y pueden contener objetos de informe como líneas, rectángulos, imágenes o campos de texto.
El motor de informes itera a través de los registros virtuales de la fuente de datos del informe proporcionada, en el momento de completar el informe. Dependiendo del comportamiento definido de cada sección, el motor muestra cada sección del informe cuando es apropiado. Por ejemplo, la sección de detalles se representa para cada registro en la fuente de datos. Cuando se producen saltos de página, las secciones de encabezado y pie de página se representan según sea necesario.
En JasperReports, las secciones de informes y terminología también se denominan report bands. Las secciones están formadas por una o más bandas. Estas secciones se llenan repetidamente en el momento de generar el informe y preparan el documento final.
Secciones principales
Una plantilla de informe en JasperReports tiene las siguientes secciones principales:
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
La siguiente tabla resume cada una de las secciones:
S.NO | Sección y descripción |
---|---|
1 | Title Esta sección aparece solo una vez al comienzo del informe. |
2 | Page Header Esta sección aparece al principio de cada página del documento generado. |
3 | Column Header Esta sección aparece al principio de cada columna en el documento generado. Si el informe solo tiene una columna definida, se ignoran las secciones de encabezado y pie de página. |
4 | Group Header Esta sección es introducida por un grupo de informes (capítulo Grupos ). Cada vez que la expresión de agrupación cambia su valor, la sección del encabezado del grupo se imprime encima de la sección de detalles. En caso de que se defina más de un grupo, el encabezado del grupo se imprime en el orden de definición del grupo. |
5 | Detail Esta sección se repite para cada línea de datos proporcionada por la fuente de datos del informe. La sección de detalle puede estar formada por varias bandas. |
6 | Group Footer Esta sección es introducida por un grupo de informes (capítulo Grupos ). La sección de pie de página del grupo se imprime debajo de la sección de detalles antes de que cambie el valor de la expresión de agrupación. El pie de página del grupo siempre se imprime para la última línea de datos en la fuente de datos. En caso de que se defina más de un grupo, el pie de página del grupo se imprime en el orden inverso al de la definición del grupo. |
7 | Column Footer Esta sección aparece al final de cada columna. Si el recuento de columnas del informe es 1, se ignoran las secciones de encabezado y pie de columna. |
8 | Page Footer Esta sección aparece al final de cada página. |
9 | Last Page Footer Esta sección reemplaza el pie de página normal en la última página del informe. En caso de que la sección de resumen también esté presente, es posible que esta no sea la última página del documento. Esta sección a veces es útil cuando la información resumida debe mostrarse en la parte inferior de la última página. |
10 | Summary Esta sección aparece solo una vez al final del informe. |
11 | No Data Esta sección se imprime cuando la propiedad del informe Cuando no se imprimen datos se establece en Sección sin datos . Si la sección <noData> está definida en la plantilla de informe, y si la fuente de datos está vacía, entonces la sección <noData> será la única que se tendrá en cuenta en el momento del llenado y su contenido generará la salida del informe. |
12 | Background La sección de fondo se muestra en cada página y no puede desbordarse a la página siguiente. Los elementos colocados en esta sección se evalúan en el momento de la inicialización de la página y se muestran en segundo plano. Todos los demás objetos de página se muestran encima de los objetos de fondo. Esta sección es útil para crear marcas de agua en la página. |
Sección, elementos y relación de atributos
El siguiente diagrama muestra la relación de elementos y atributos en una sección de un informe.
Elementos de la sección
Todas las secciones del informe mencionadas anteriormente son opcionales. Pero cualquier plantilla de informe tendrá al menos una de esas secciones. Cada una de estas secciones contiene un solo <band> elemento como su único subelemento. A <band> puede contener cero o más subelementos siguientes -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> o <elementGroup>
Cada uno de estos elementos debe contener un solo <reportElement> como su primer elemento (excepto elementGroup). A <reportElement> determina cómo se distribuyen los datos para ese elemento en particular. A diferencia de las variables y los parámetros, no es necesario que los elementos del informe tengan un nombre, porque normalmente no es necesario obtener ningún elemento individual dentro de una plantilla de informe.
La siguiente tabla resume los atributos de <reportElement> -
Atributo | Descripción | Valores válidos |
---|---|---|
X | Especifica la coordenada x del elemento de banda. | Un valor entero que indica la coordenada x del elemento en píxeles. Este atributo es obligatorio. |
y | Especifica la coordenada y del elemento de banda. | Un valor entero que indica la coordenada y del elemento en píxeles. Este atributo es obligatorio. |
anchura | Especifica el ancho del elemento de banda. | Un valor entero que indica el ancho del elemento en píxeles. Este atributo es obligatorio. |
altura | Especifica la altura del elemento de banda. | Un valor entero que indica la altura del elemento en píxeles. Este atributo es obligatorio. |
llave | Identificador único del elemento de la banda. | Un valor de cadena único. |
stretchType | Especifica cómo se estira el elemento cuando se estira la banda contenedora | NoStretch (default) - El elemento no se estirará. RelativeToTallestObject - El elemento se estirará para acomodar el objeto más alto de su grupo. RelativeToBand - El elemento se estirará para adaptarse a la altura de la banda. |
Tipo de Posición | Especifica la posición del elemento cuando la banda se estira. | Float - El elemento se moverá dependiendo del tamaño de los elementos circundantes. FixRelativeToTop (default) - El elemento mantendrá una posición fija con respecto a la parte superior de la banda. FixRelativeToBottom - El elemento mantendrá una posición fija con respecto a la parte inferior de la banda. |
isPrintRepeatedValues | Especifica si se imprimen valores repetidos. | true (default) - Se imprimirán los valores repetidos. false - Los valores repetidos no se imprimirán. |
modo | Especifica el modo de fondo del elemento. | Opaco, Transparente |
isRemoveLineWhenBlank | Especifica si el elemento debe eliminarse cuando está en blanco y no hay otros elementos en el mismo espacio horizontal. | verdadero Falso |
isPrintInFirstWholeBand | Especifica si el elemento debe imprimirse en una banda completa, es decir, una banda que no esté dividida entre páginas o columnas del informe. | verdadero Falso |
isPrintWhenDetailOverFlows | Especifica si el elemento se imprimirá cuando la banda se desborde a una nueva página o columna. | verdadero Falso |
printWhenGroupChanges | Especifica que el elemento se imprimirá cuando cambie el grupo especificado. | Un valor de cadena. |
color primario | Especifica el color de primer plano del elemento. | Ya sea un valor RGB hexadecimal precedido por el carácter #, o uno de los siguientes valores predefinidos: negro, azul, cian, gris oscuro, gris, verde, gris claro, magenta, naranja, rosa, rojo, amarillo, blanco. |
color de fondo | Especifica el color de fondo del elemento. | Igual que los valores válidos para forecolor |
Atributos de sección
A continuación se muestran los atributos de una sección de informe:
Altura
La altura de la sección especifica la altura en píxeles de esa sección en particular y es muy importante en el diseño general del informe.
Imprimir cuando la expresión
Una expresión booleana que determina si la sección debe imprimirse o no.
Split permitido
Una bandera que indica si la sección puede dividirse cuando no cabe en la página actual. Si es verdadero, la sección se transferirá a la página siguiente. Tenga en cuenta que, en caso de que la sección no quepa en la página siguiente, la sección se dividirá independientemente del valor de la bandera. splitType puede tomar los siguientes valores:
splitType = "Stretch:" Divide el contenido ampliado . Si la sección se extiende en la página actual (si el espacio disponible es menor que la altura declarada), la región que se agrega a la altura original puede dividirse en la página siguiente.
splitType = "Prevent:" Evita la división en el primer intento. Si la sección no cabe en la página siguiente, la división ocurre normalmente, ya que la prevención de división de banda es efectiva solo en el primer intento de división.
splitType = "Inmediato:" Dividir inmediatamente. La banda puede dividirse en cualquier lugar excepto arriba, su elemento más alto.
Ejemplo
Para demostrar cada sección, escribamos la plantilla de informe (jasper_report_template.jrxml). Guarde este archivo enC:\tools\jasperreports-5.0.1\testdirectorio. En este archivo, estaríamos mostrando un texto en cada una de las secciones (discutimos anteriormente). El contenido del archivo es el que se indica a continuación:
<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "300" pageHeight = "300"
columnWidth = "300" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0" >
<title>
<band height = "50">
<textField>
<reportElement x = "100" y = "16" width = "100" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Title"]]>
</textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height = "40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20"/>
<textElement>
<font isBold = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Page Header"]]>
</textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement>
<font isItalic = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Column Header"]]>
</textFieldExpression>
</textField>
</band>
</columnHeader>
<detail>
<band height ="40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20" backcolor = "#99CCFF"/>
<textElement/>
<textFieldExpression>
<![CDATA["Report Details"]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Column Footer"]]>
</textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Last Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</lastPageFooter>
<summary>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Summary"]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
El código Java para completar y generar el informe se muestra a continuación. Guardemos este archivoJasperReportFill.java al directorio C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.
package com.tutorialspoint;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Aquí, usamos una instancia de JREmptyDataSource al llenar informes para simular una fuente de datos con un registro, pero con todos los campos en este único registro siendo nulos.
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) es el siguiente.
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) de la siguiente manera:
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, defau
[javac] Compiling 1 source file 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.JRXmlDigesterFac
[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.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds
Como resultado de la compilación anterior, se abre una ventana de JasperViewer como en la siguiente pantalla:
Aquí podemos ver en cada uno de los apartados que se imprime un texto. Cabe señalar que, como JRXML contiene un elemento <lastPageFooter>, se mostrará en la última página del informe en lugar de mostrar el elemento <pageFooter>. Los elementos <columnHeader> y <columnFooter> solo se mostrarán en el informe, si tiene más de una columna.