Ejemplo 2: primer reporte usando el API de JasperReports

Hola a todos, veo que el tutorial si tiene algunos visitantes, me alegro por ello, porque significa que es de utilidad.

En este segundo ejemplo, vamos a diseñar el mismo reporte del Ejemplo 1, pero esta vez lo haremos sin la plantilla, usando únicamente el API de JasperReports.

El proceso de compilar, llenar y exportar el reporte no cambió, es idéntico al proceso que se hace para el reporte basado en plantilla, lo que cambia es que ya no cargamos el reporte desde la plantilla, sino que lo creamos mediante código, veamos el cambio en el método executeReport de la clase “HelloWorldReportExecutor”:


ReportCreator reportCreator=new ReportCreator();
JasperDesign jasperDesign=reportCreator.createReport("Sample2Report");

En este caso se instancia un objeto del tipo “ReportCreator” que es la clase donde tenemos la lógica para diseñar nuestro reporte (método “reportCreator.createReport”).

Ahora pasemos a ver el código con el cual diseñamos el reporte (clase “ReportCreator”):


JasperDesign jasperDesign=createBasicStructure(reportName);
for (JRDesignStyle jrDesignStyle : createStyles()) {
try {
jasperDesign.addStyle(jrDesignStyle);
} catch (JRException e) {
log.error("Error in adding a style to the report... "+e.getMessage());
}
}
jasperDesign.setTitle(
createTitleBand(
(JRStyle) jasperDesign.getStylesMap().get("titleStyle")
)
);
return(jasperDesign);

En este método, inicialmente se crea la estructura básica del reporte (llamando al método “createBasicStructure”), luego se añade los estilos al reporte, y finalmente se crea y añade la banda del título.

La estructura básica del reporte, se refiere a los elementos generales del reporte (tamaño de página, márgenes, nombre del reporte, etc.), en la plantilla sería el tag “jasperReport” y sus atributos. Veamos una parte de ese método:

private JasperDesign createBasicStructure(String reportName){
JasperDesign jasperDesign=new JasperDesign();
jasperDesign.setName(reportName);
jasperDesign.setColumnCount(1);
jasperDesign.setPageWidth(612);
jasperDesign.setPageHeight(792);
...
return(jasperDesign);
}

Los atributos del reporte, se van llenando en el objeto de tipo “JasperDesign” que es el contenedor del diseño de nuestro reporte.

Continuando, ahora creamos los estilos para nuestro reporte, y los vamos añadiendo, un estilo se crea de la siguiente manera:

JRDesignStyle titleStyle=new JRDesignStyle();
titleStyle.setName("titleStyle");
titleStyle.setDefault(true);
titleStyle.setFontName("Helvetica");
titleStyle.setForecolor(Color.BLUE);
titleStyle.setFontSize(20);
titleStyle.setBold(true);
titleStyle.setItalic(false);
titleStyle.setUnderline(false);
titleStyle.setStrikeThrough(false);
titleStyle.setPdfFontName("Helvetica-Bold");
titleStyle.setPdfEncoding("Identity-H");
titleStyle.setPdfEmbedded(true);

Es decir, creamos una instancia de la clase “JRDesignStyle” y vamos llenando los atributos necesarios, luego estos estilos son agregados al reporte, como ya vimos en el primer fragmento de código del ejemplo.

Finalmente, aunque es el trabajo más extenso, vamos a crear la banda del título. Veamos el código para ir analizando:

private JRDesignBand createTitleBand(JRStyle jrStyle){
JRDesignBand designBand=new JRDesignBand();
designBand.setHeight(20);
designBand.setSplitAllowed(true);
//Create a TextField (textFieldTag attributes)
JRDesignTextField textField=new JRDesignTextField();
textField.setStretchWithOverflow(true);
textField.setBlankWhenNull(true);
textField.setEvaluationTime(JRExpression.EVALUATION_TIME_NOW);
textField.setHyperlinkType(JRHyperlink.HYPERLINK_TYPE_NONE);
textField.setHyperlinkTarget(JRHyperlink.HYPERLINK_TARGET_SELF);
textField.setStyle(jrStyle);
textField.setX(0);
textField.setY(4);
textField.setWidth(100);
textField.setHeight(13);
textField.setKey("titleTextField");
textField.setStretchType(JRElement.STRETCH_TYPE_RELATIVE_TO_TALLEST_OBJECT);
textField.setPositionType(JRElement.POSITION_TYPE_FLOAT);
//box tag properties
textField.getLineBox().setPadding(1);
textField.getLineBox().getPen().setLineWidth(0);
textField.getLineBox().getPen().setLineColor(Color.BLACK);
textField.getLineBox().getPen().setLineStyle(JRPen.LINE_STYLE_SOLID);
//TextField expression
JRDesignExpression designExpression=new JRDesignExpression();
designExpression.setValueClass(String.class);
designExpression.setText("\"Hello world, from JasperReports.... API\"");
//Setting the expression
textField.setExpression(designExpression);
//Add the textField to the band
designBand.addElement(textField);
return(designBand);
}

Lo primero que se hace, es crear una banda (usando la clase “JRDesignBand”), a la cual le ponemos algunos atributos básicos.

Paso seguido, creamos el elemento de texto (usando la clase “JRDesignTextField”), a la que configuramos mediante sus atributos como ser: tamaño, posición, estilo, etc. Aquí algo a resaltar es como se configura el borde y el espacio interno (padding), un “JRDesignTextField” tiene relacionado un objeto de clase “JRLineBox” que es el que define éstos aspectos.

Luego creamos la expresión para el campo de texto, eso creando una instancia de la clase “JRDesignExpression”, a la cual luego, le decimos que te tipo será la expresión (método “setValueClass”) y le damos el texto de la expresión misma (método “setText”). Esta expresión, luego la relacionamos con el objeto “textField”.

Una vez que tenemos el campo de texto listo, lo añadimos a la banda (usando el método “addElement”) y tenemos lista la banda de título.

Para una mejor comprensión de la estructura de clases del reporte, aquí presento un diagrama de clases, de lo mas importante que tocamos en este ejemplo (ojo, solo lo que utilizamos en el ejemplo).

Diagrama de clases para el ejemplo 2

Hasta aquí va el ejemplo, espero se comprenda, los pasos para ejecutarlo, son los mismos que en el primer ejemplo, es decir usando la librería “Ant” o si prefieren, usando el IDE de su preferencia.

Pueden descargar el código del ejemplo aqui: Ejemplo2

5 comentarios el “Ejemplo 2: primer reporte usando el API de JasperReports

  1. Pingback: Segundo ejemplo del tutorial, listo. « Solo para burriquines

  2. Bueno, primero tienes que cargarlo en un objeto jasperReport:
    JasperReport jasperReport = (JasperReport)JRLoader.loadObject(new File("filename.jasper"));
    Luego puedes acceder al API, como ves en los ejemplos del tutorial, tendrías que acceder a tu textfield, y ahí puedes cambiar el estilo que se usa (también pudedes añadir nuevos estilos a través del API, al mapa de estilos). Fíjate el último ejemplo que esta mas actualizado. Saludos.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s