JasperReports
Jasper Report es una librería para la generación de
informes. Está escrita en java y es libre. El funcionamiento consiste en
escribir un xml donde se recogen las particularidades del informe. Este XML lo
tratan las clases del Jasper para obtener una salida que pueden ser un PDF,
XML, HTML,
CSV, XLS, RTF, TXT.
Para generar el XML, o el compilado.
Jasper les recomiendo descargar la herramienta iReport que es un Entorno
Gráfico que está implementado en java y se integra perfectamente con el Jasper
Report.
Aunque
JasperReports se utiliza principalmente para capacidades de reporte a las
aplicaciones basadas en la Web a través de la API de Servlet, no tiene
absolutamente ninguna dependencia de la API Servlet o cualquier otra biblioteca
de Java EE. No hay nada que nos impida la creación de aplicaciones de
escritorio Java para generar informes con JasperReports.
JasperReports nos permite separar los
datos en secciones. Estas secciones incluyen:
·
El
título del informe, que aparecerá una vez en la parte superior del informe.
·
Un
encabezado de página, que aparecerá en la parte superior de cada página.
·
Una
sección de detalle, que normalmente contiene los datos de los informes
primarios.
·
A
pie de página, que aparecerá en la parte inferior de cada página.
·
Una
sección de resumen, que aparecerá al final del informe.
Primer paso. Instalación del plugin iReport.
Una
vez descargado lo descomprimiremos y tendremos la siguiente estructura de
archivos:
${distro.zipfilename.extensions}.nbm
iReport-5.5.0.nbm
jasperreports-components-plugin-5.5.0.nbm
jasperserver-plugin-5.5.0.nbm
iReport-5.5.0.nbm
jasperreports-components-plugin-5.5.0.nbm
jasperserver-plugin-5.5.0.nbm
Ya
en NetBeans deberemos instalar el plugin. Para ello en la barra de menús nos
moveremos a Herramientas ->Plugins.
Se
nos abrirá una nueva ventana donde añadiremos el plugin descargado. Nos
moveremos a Descargados ->Agregar Plugins
Tras
esto nos quedará buscar la ruta donde descomprimimos el plugin y agregar todos
los plugins e iniciar la instalación pulsando el botón “Instalar”.
Después
de seguir los simples pasos de la instalación tendremos el plugin instalado.
Segundo
paso. Agregar las librerías de JasperReports
Bajar las librerías directamente de la
página oficial de JasperReports, pues JasperReports necesitas librerías
adicionales que detallaremos a continuación.
Link
de las librerías de JasperReport:
En este caso estamos trabajado
con la versión 6.2.0 que trae todas las librerías necesarias.
Tras la descarga
descomprimiremos el archivo y veremos la siguiente estructura de archivos. Nos
centraremos en las carpetas dist y lib.
Lo
siguiente que haremos es recopilar los siguientes archivos de esas dos
carpetas.
De
la carpeta lib:
commons-beanutils-x.jar
commons-collections-x.jar
commons-digester-x.jar
commons-javaflow-x.jar
commons-logging-x.jar
groovy-all-x.jar
itext-x.jar
log4j-x.jar
png-encoder-x.jar
xalan-x.jar
commons-collections-x.jar
commons-digester-x.jar
commons-javaflow-x.jar
commons-logging-x.jar
groovy-all-x.jar
itext-x.jar
log4j-x.jar
png-encoder-x.jar
xalan-x.jar
De la carpeta dist solo necesitaremos uno:
jasperreports-x.jar
Una
vez recopilados todos estos archivos en una misma carpeta tendremos que agregar
la librería a NetBeans moviéndonos a Herramientas-Libreries
Seguidamente
deberemos crear una nueva librería, pincharemos en New Library… y
le daremos nombre el nombre la librería “JasperReports”
(sin comillas).
Solo nos quedará añadir todos los archivos
recopilados anteriormente. Para ello pincharemos
en Agregar archivo
JAR/Carpeta y buscaremos la ruta donde los tengamos
alojados.
Configuración de DataSource
Crearemos
un “datasource” en iReport para poder acceder a nuestros datos y hacer pruebas
directamente, sin necesidad de una aplicación Java (por el momento). Para crear
este datasource hacemos clic en el ícono “Report Datasources” ubicado en la
barra de herramientas de iReport:
Con lo
que se abrirá la ventana de “Connections / Datasources”
que en este momento debe contener solo un “Empty datasource” y la conexión a
una base de datos de prueba en HSQLDB. Ahora hacemos clic en el botón “New”
para crear nuestro nuevo datasource.
En la
nueva ventana seleccionamos “Database JDBC connection” y presionamos el botón
“Next”. En la siguiente ventana debemos proporcionar algunos datos como el
nombre se le dará al datasource y los datos para realizar la conexión de la
base de datos.
Antes de
guardar esta configuración hagan clic en el botón “Test” para probar que todos
los datos proporcionados son correctos. Si todo ha salido bien, al hacer clic
en el botón “Save” la ventana actual debe cerrarse y nuestro datasource debe
estar ahora en la ventana “Connections / Datasources”.
Creación de reportes usando Wizard, archivo jrxml
Crearemos
nuestro primer reporte utilizando el Wizard de iReport para lo cual vamos al
menú “File -> New” y en la parte inferior derecha damos clic en Launch
Report Wizard.
A
continuación, seguiremos una serie de pasos guiada por el Wizard:
·
Colocar
el nombre y la ruta del archivo .jxrml de nuestro reporte.
·
Diseñamos
el Query con los campos necesario para nuestro reporte Ejemplo: “SELECT * FROM
estudiante” y damos clic en siguiente.
·
Seleccionamos
todos los campos y damos clic en siguiente.
·
Por
último agrupamos los campos de ser necesario sino damos clic en terminar.
Ahora
tenemos creada nuestra plantilla solo falta realizar un diseño de acuerdo a
nuestro gusto o el requerimiento del proyecto, yo la hare sencilla para el
objetivo de esta prueba.
En
la parte derecha encontramos la paleta y todos los elementos disponibles para nuestro
diseño para este caso solo usare los elementos: Static Text y TextField. (En
los TextField dar clic derecho en edit expression y escoger el campo adecuado a
mostrar).
Una
vez finalizado el diseño damos clic en preview esperamos que compile el .jrxml
y se nos abrirá automáticamente el documento .pdf (cabe mencionar que también
se puede exportar otros formatos de documentos).
Ahora crearemos un nuevo proyecto en NetBeans. Para esto vamos al menú “File -> new Project”. En la ventana de nuevos proyectos seleccionamos la categoría “Java” y de tipo de proyecto seleccionamos “Java Application” y hacemos clic en el botón “Next”, luego colocamos el nombre del proyecto y seleccionamos el check Create Main Class y damos clic en finish.
Para
utilizar JasperReport debemos de crear nuestra biblioteca con los .jar de
jasper para esto vamos al menú “Tools -> Libraries” y seleccionamos los
siguientes .jar
·
jasperreports-5.5.0.jar
·
jasperreports-5.5.0-javaflow.jar
·
jasperreports-fonts-5.5.0.jar
·
commons-beanutils-1.8.0.jar
·
commons-collections-2.1.1.jar
·
commons-digester-2.1.jar
·
commons-logging-1.1.1.jar
·
commons-javaflow-20060411.jar
·
groovy-all-2.0.1.jar
·
iText-2.1.7.jar
·
png-encoder-1.5.jar
·
poi-3.7-20101029.jar
Algunos
de estos jars se encuentran en el directorio “dist” y otros en el directorio
“lib” del archivo .zip de JasperRepots que descargamos. Luego al añadirlos
todos damos clic en OK.
En
la parte izquierda inferior del proyecto damos clic derecho en Libraries y
seleccionamos “Add Library” y escogemos la librería que acabamos de crear en mi
caso se llama JASPER damos clic en Add Library.
Cuando
hicimos las primeras pruebas en iReport se generó un archivo, este archivo lo
copiamos en el directorio raíz de nuestro proyecto de NetBeans.
Ahora
creamos la conexión hacia la base de datos, no olviden agregar el .jar del
driver de MySQL o también pueden agregar la librería que viene incluida en
NetBeans.
1
2
3
4
|
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); "jossjack", "123456"); } |
Al tratar de hacer la
conexión es posible que ocurra un error, y se lance una excepción de tipo “java.sql.SQLException”.
Para solucionar esto pueden hacer dos cosas. La primera es rodear estas líneas
en una clausula try/catch. La segunda opción es agregar la cláusula throws
Exception en el método main.
Ahora
se cargará el archivo jasper para lo cual se necesitará de estas clases:
·
import
net.sf.jasperreports.engine.JasperReport
·
import
net.sf.jasperreports.engine.util.JRLoader
1
|
JasperReport
reporte = (JasperReport) JRLoader.loadObject("jack.jasper"); |
Ahora
el objeto “reporte” contiene la definición del reporte, ahora solo falta
llenarlos con la información de la base de datos. Para esto usamos las clases:
·
import
net.sf.jasperreports.engine.JasperFillManager
·
import
net.sf.jasperreports.engine.JasperPrint;
JasperFillManager tiene
un método estático, “fillReport”, que nos permite
llenar el reporte con datos obtenidos de distintas fuentes de datos. En este
caso la fuente de datos es la conexión directa a la base de datos que creamos
anteriormente (el objeto conexion).
El objeto “JasperPrint”
que obtenemos como resultado de la invocación del método “fillReport” es la
representación de nuestro reporte (ahora con datos) que podemos mandar a
imprimir, mostrar en pantalla (si estamos usando una aplicación swing o awt),
o, como en este caso, guardarlo en un archivo.
Si están haciendo una
aplicación swing y quieren mostrar este reporte directamente en un componente
pueden pasar el objeto “JasperPrint”
que acabamos de crear como parámetro a un nuevo objeto:
·
import
net.sf.jasperreports.view.JasperViewer
El
cual es un componente swing, y agregar este último a un panel. Para guardar
este reporte a un archivo debemos usar:
·
import
net.sf.jasperreports.engine.JRExporter
El
cual es una interface, y las clases que la implementan nos permiten generar el
reporte en distintos formatos de una forma sencilla. Se pueden generar los
reportes en los siguientes formatos:
·
PDF
·
HTML
·
CSV
·
RTF
·
TXT
·
XLS
·
XML
·
XLSX
·
DOCX
·
PPTX
Si queremos guardar el
reporte en formato .pdf tenemos que crear un objeto net.sf.jasperreports.engine.export.JRPdfExporter y
lo asignamos al objeto exporter.
1
2
3
4
|
JRExporter
exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
new java.io.File("reporte_jackPDF.pdf")); exporter.exportReport(); |
La
segunda línea asigna a nuestro objeto “exporter” el “jasperPrint” ya con los
datos. La tercera línea le dice al “exporter” cuál será el nombre del archivo
generado. La última línea es la que realiza el proceso de exportación. Si ahora
ejecutamos nuestra aplicación veremos que en el directorio raíz del proyecto se
ha creado un archivo llamado “reporte_jackPDF.pdf”:
Asi
quedaria el codigo de la clase Main:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import java.sql.Connection; import java.sql.DriverManager; import net.sf.jasperreports.engine.JRExporter; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.util.JRLoader; public class Reporte_jack
{ public static void main(String[]
args) throws Exception
{ Class.forName("com.mysql.jdbc.Driver"); Connection
conexion = DriverManager.getConnection JasperReport
reporte = (JasperReport) JRLoader.loadObject("jack.jasper"); JasperPrint
jasperPrint = JasperFillManager.fillReport(reporte, null, conexion); JRExporter
exporter = new JRPdfExporter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT,
jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE,
new java.io.File("reporte_jackPDF.pdf")); exporter.exportReport(); } } |
Para
generar un reporte web crearemos un Servlet en este caso ReporteWeb, el cual
puede recibir parametros ya sea mediante requerimientos GET, pasandole
atributos en la sesion o en el request de manera que el reporte generado pueda
ser más específico.
Primero
crearemos una conexion hacia la base de datos que llamaremos
Connection conexion =
C.getConn();
luego
pasaremos como parametro al metodo JasperRunManagerToPdf los objetos
jasperReport y la conexion
byte[] bytes =
JasperRunManager.runReportToPdf(jasperReport, parametros, conexion);
que devolvera una cadena de
bytes que seran enviada como streaming al cliente, mediante un ServletOutputStream.
Asi
quedaria el codigo del Servlet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
import com.web.conexion.Conexion; import java.io.File; import java.io.IOException; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.JasperRunManager; import net.sf.jasperreports.engine.util.JRLoader; public class ReporteWeb
extends HttpServlet
{ protected void processRequest(HttpServletRequest
request, HttpServletResponse
response) throws
ServletException,
IOException, SQLException { ServletContext
sc; Map
parametros = new
HashMap(); sc
= this.getServletContext(); Connection
conexion = null; Conexion
C = null; try { C
= new Conexion(); C.conectar(); conexion
= C.getConn(); File
reportFile = new
File(sc.getRealPath("/reportes/jack.jasper")); JasperReport
jasperReport = (JasperReport) JRLoader.loadObject(reportFile.getPath());
//se ejecuta el reporte byte[]
bytes = JasperRunManager.runReportToPdf(jasperReport, parametros,
conexion); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream
ouputStream = response.getOutputStream(); ouputStream.write(bytes,
0, bytes.length); ouputStream.flush(); ouputStream.close(); }
catch (JRException
e) { throw new ServletException(e); }
catch (IOException
e) { throw new ServletException(e); }
finally { conexion.close(); } } @Override protected void doGet(HttpServletRequest
request, HttpServletResponse response) throws ServletException,
IOException { try { processRequest(request,
response); }
catch (SQLException
ex) { Logger.getLogger(ReporteWeb.class.getName()).log(Level.SEVERE,
null, ex); } } } |
Al
llamar al Servlet mediante un requerimiento GET este mostraria el reporte en el
navegador.
Campos
calculados en iReport
Solo tenemos textos estáticos y "fields"
para mostrar un reporte básico de los datos de ciertos participantes. Si lo
recuerdan, la salida del reporte al generarlo desde nuestra aplicación Java, es
la siguiente:
Ejemplo:
PARAMETROS
Ahora pasaremos a agregar "Parameters"
a este reporte. Como dije en el tutorial anterior: los parámetros son valores
que usualmente se pasan al reporte desde el programa que crea el "JasperPrint" del reporte (nuestra aplicación Java) haciendo uso de
un "java.util.Map".
En este caso pasaremos dos parámetros: el título del reporte, y el nombre del autor del mismo.
Al igual que con los Fields, para poder hacer uso de un parámetro primero hay que declararlo en el "Report Inspector" (situado en el panel izquierdo del iReport), por lo que nos dirigimos a esta ventana y hacemos clic derecho sobre el nodo "Parameters". Al hacer esto se abrirá un menú contextual. Seleccionamos la opción "Add Parameter" (la única habilitada).
En este caso pasaremos dos parámetros: el título del reporte, y el nombre del autor del mismo.
Al igual que con los Fields, para poder hacer uso de un parámetro primero hay que declararlo en el "Report Inspector" (situado en el panel izquierdo del iReport), por lo que nos dirigimos a esta ventana y hacemos clic derecho sobre el nodo "Parameters". Al hacer esto se abrirá un menú contextual. Seleccionamos la opción "Add Parameter" (la única habilitada).
Con esto se agregará un nuevo parámetro llamado "parameter1" de tipo "java.lang.String". Cambiamos en nombre del parámetro en la ventana de propiedades a "titulo" (recuerden que este nombre es el que deberemos usar desde nuestra aplicación Java para establecer el valor del parámetro).
Agregamos otro parámetro llamado "autor" de la misma forma que agregamos el de "titulo".
Ahora eliminamos el elemento que teníamos como título del reporte (el que contiene el texto estático "Reporte de Participantes") y lo reemplazamos por el parámetro "titulo" arrastrándolo desde la ventana del "Report Inspector" a la banda "Title".
Ajustamos este elemento para que tenga el mismo formato que el título que teníamos anteriormente.
Ahora agregamos el segundo parámetro ("autor") en la banda "Page Header", la cual se repite en la parte superior de cada una de las páginas (en la primera página aparece después del título), arrastrándolo a esta banda.
Si dejamos esta expresión tal y como está ("$P{autor}") solo se mostrará en nombre del autor en la parte superior de cada una de las páginas (por ejemplo si el autor del reporte es "Juan", solo veremos la palabra "Juan" en la parte superior de los reportes). Esto podría no ser claro para quienes revisen este reporte, por lo que queremos indicar de forma explícita que a lo que se refiere el valor de este parámetro es el nombre del autor. Para hacer esto nos dirigimos a la ventana de propiedades de este parámetro (para lo cual debemos tenerlo seleccionado) y buscamos la categoría "Text field properties". Ahi se encuentra una propiedad llamada "Text Field Expression" cuyo valor es "$P{autor}".
Lo que haremos es editar esta expresión para anteponer la palabra "Autor: ". Para hacer esto presionamos el botón "...", con lo que se abrirá una ventana que nos permitirá editar la expresión. En esta ventana modificamos la expresión "$P{autor}" para que quede "Autor: " + $P{autor}. Con esto lo que logramos es que a la cadena estática "Autor: " se le concatene el valor de la expresión dinámica "$P{autor}". Por lo que ahora el lo que aparecerá en la parte superior de cada página del reporte será la cadena "Autor: Juan".
Ahora presionamos el botón "Compile Report" para que se genere el reporte compilado "reporte2.jasper".
Veamos una vista previa del reporte, para esto hacemos clic en la pestaña "Preview". Nos pedirá los valores de los dos parámetros. Si colocamos para el parámetro "titulo" el valor "Reporte" y para el parámetro "autor" el valor "Alex" el preview que veremos será el siguiente:
Ahora veremos cómo pasarle estos valores desde nuestra aplicación Java, por lo que abrimos nuestro IDE de trabajo, NetBeans.
Ahí nos dirigimos a la clase "Main" que creamos la última vez y buscamos la línea en donde creamos nuestro objeto "JasperPrint":
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaPariticipantes));
Y antes de esta línea crearemos un objeto "java.util.Map" que contendrá nuestros parámetros. Colocaremos el nombre de los parámetros (en este caso "autor" y "titulo") como llave y sus respectivos valores, "Juan" para el autor y "Reporte Participantes" para el título, como valores.
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("autor", "Juan");
parametros.put("titulo", "Reporte Participantes");
Y pasamos este "Map" como el segundo parámetro del método "fillReport", al que hasta ahora le hemos pasado "null":
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(listaPariticipantes));
El código de nuestro método "main" queda así:
public static void main(String[] args) throws Exception
{
List<Participante> listaPariticipantes = new ArrayList<Participante>();
for (int i = 1; i <= 10; i++)
{
Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i);
listaPariticipantes.add(p);
}
JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("autor", "Juan");
parametros.put("titulo", "Reporte Participantes");
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(listaPariticipantes));
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte3PDF.pdf"));
exporter.exportReport();
}
Si ejecutamos nuestro reporte obtendremos un archivo con el siguiente contenido:
Como podemos ver los parámetros "titulo" y "autor" han sido reemplazados por los valores "Reporte Participantes" y "Juan" respectivamente.
Gracias a los parámetros podemos pasar valores (como en este caso cadenas, pero podemos pasar prácticamente cualquier tipo de objeto) a nuestro reporte directamente desde nuestra aplicación Java.
Ahora veremos el último tipo de expresión que JasperReports nos proporciona, las Variables.
Como dije en el post anterior: las variables son objetos usados para almacenar valores como los resultados de cálculos.
En este caso usaremos dos variables. La primera será una de las variables internas que ya proporciona JasperReports: PAGE_NUMBER, que nos dice el número de la página actual. En este caso como el reporte solo tendrá una página solo aparecerá el número 1, pero pueden extender el ejemplo para que se generen más páginas.
La segunda variable que usaremos será una variable creada por nosotros mismos y nos mostrará la suma de los puntos de los Participantes (en este momento los Participantes no tienen puntos, por lo que tendremos que agregarlos).
Lo primero que haremos es modificar la clase "Participante" agregando el atributo "puntos" de tipo "int" con sus correspondientes setters y getters:
private int puntos;
public int getPuntos()
{
return puntos;
}
public void setPuntos(int puntos)
{
this.puntos = puntos;
}
y en nuestro método "main" agregamos, en el ciclo que crea los objetos "Participante", el siguiente código para establecer los puntos de cada uno de los Participantes:
p.setPuntos(i);
Ahora regresamos a iReport y agregamos un nuevo Field en la ventana "Report Inspector" llamado "puntos" de tipo "java.lang.Integer". Este field será usado para mostrar los puntos que tiene cada uno de los Participantes.
Agregamos una columna, dentro de la banda "Details 1", para mostrar este field:
Si compilamos nuestro reporte y ejecutamos nuestra aplicación Java debemos ver un reporte con el siguiente contenido:
Campos calculados
Agregaremos la
variable que realizará la suma de los puntos de todos los Participantes. Para esto agregamos una nueva variable en el nodo "Variables" de la ventana "Report Inspector" haciendo clic derecho sobre este nodo y
seleccionando la opción "Add Variable"
del menú contextual que se abre.
Modificamos sus propiedades en la ventana "Properties" cambiando su nombre a "sumaPuntos", su "Variable Class" a "java.lang.Integer", y "Calculation" a "Sum" (con esto indicamos que la variable mantendrá la suma de los valores que indicaremos más adelante, otras opciones incluyen un contador, el promedio, el valor más alto, etc.).
Ahora indicaremos la suma de cuáles valores son los que queremos que se almacene en este variable. Para eso hacemos clic en el botón "..." de la propiedad "Variable Expression", con lo que se abrirá una nueva ventana. Es esta nueva ventana indicaremos de dónde se tomarán los valores para la suma. Podemos usar una expresión tan compleja como necesitemos. Como en este caso solo queremos realizar la suma de los puntos escribimos "F{puntos}". Y presionamos el botón "OK" para confirmar.
Al final las propiedades de nuestra variable deben quedar así:
Ahora solo arrastramos nuestra variable "sumaPuntos" desde el "Report Inspector" hasta la banda "Summary". Esta banda se muestra cuando ya se han mostrado todos los datos de la banda "Details 1" y se muestra justo abajo de ella.
Agregaré un texto estático y una línea en esta banda solo para que se vea un poco mejor. Nuestro reporte hasta ahora debe verse así:
Ahora para terminar agregaremos la variable "PAGE_NUMBER" que nos dice el número de página actual en el reporte. Arrastramos esta variable desde el "Report Inspector" hasta la banda "Page Footer", la cual se muestra en la parte inferior de cada página.
Podría parecer un poco extraño que la banda "Summary" que se encuentra abajo de la banda "Page Footer" en el designer vaya a aparecer antes en el reporte final, pero confíen en mi, así será ^_^.
Agregaré también un texto estático solo para indicar que el valor que estamos mostrando corresponde al número de página. Al final el reporte queda así:
Ahora guardamos y compilamos nuestro reporte y ejecutamos nuestra aplicación desde el NetBeans. El reporte generado debe verse así:
Como podemos ver, la variable "sumaPuntos" contiene la suma de los puntos de todos los participantes (55).
Nuestra clase "Participante" queda de la siguiente forma:
public class Participante
{
private int id;
private String nombre;
private String username;
private String password;
private String comentarios;
private int puntos;
public Participante()
{
}
public Participante(int id, String nombre, String username, String password, String comentarios)
{
this.id = id;
this.nombre = nombre;
this.username = username;
this.password = password;
this.comentarios = comentarios;
}
public String getComentarios()
{
return comentarios;
}
public void setComentarios(String comentarios)
{
this.comentarios = comentarios;
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getNombre()
{
return nombre;
}
public void setNombre(String nombre)
{
this.nombre = nombre;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public int getPuntos()
{
return puntos;
}
public void setPuntos(int puntos)
{
this.puntos = puntos;
}
}
y nuestra clase "Main" de la siguiente forma (omitiendo los imports):
public class Main
{
public static void main(String[] args) throws Exception
{
List<Participante> listaPariticipantes = new ArrayList<Participante>();
for (int i = 1; i <= 10; i++)
{
Participante p = new Participante(i, "Particpante " + i, "Usuario " + i, "Pass " + i, "Comentarios para " + i);
p.setPuntos(i);
listaPariticipantes.add(p);
}
JasperReport reporte = (JasperReport) JRLoader.loadObject("reporte2.jasper");
Map<String, String> parametros = new HashMap<String, String>();
parametros.put("autor", "Juan");
parametros.put("titulo", "Reporte Participantes");
JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, parametros, new JRBeanCollectionDataSource(listaPariticipantes));
JRExporter exporter = new JRPdfExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporte3PDF.pdf"));
exporter.exportReport();
}
}
Los parámetros son expresiones que nos permiten pasar valores, desde nuestra aplicación Java, a los reportes generador por JasperReports. Y las variables almacenan valores que son el resultado de cálculos de distinta naturaleza sobre los valores que recibimos en nuestro reporte.
Ejecución de reportes, archivo Jasper
Ejecutar un reporte desde
Netbeans
Bien para ejecutar un
reporte desde NetBeans hagan lo siguiente:
Den de alta un JFrame Form
dentro de su proyecto, clic derecho sobre su package principal eligen New –
JFrame Form, yo lo llamaré muestraReporte.
Dentro
de nuestro JFrame, creamos un botón que es el que va a llamar a nuestro
reporte, para esto del lado derecho tenemos el Swing Controls, clic sobre
button y vuelves a dar clic sobre el form para que se inserte.
Después
haz doble clic sobre el botón para que cree el evento actionPerformed, que
es el evento que le indicará a nuestra aplicación que es lo que se hará si se
oprime el botón.
Ahora
ingresaremos el siguiente código y te lo explico abajo.
Primero
si te das cuenta tenemos las librerías que vamos a ocupar y que antes ya
importamos, si no lo has hecho checa este post, haz clic aqui.
Después
damos de alta nuestro JDialog para
indicar que desde una nueva ventana se abrirá nuestro reporte.
Enseguida
se da de alta la conexión a la base de datos, yo lo llamo como conexion.conexion por
que la primera conexion quiere decir que es mi Package y la segunda conexion
quiere decir que es mi Clase, si tienes dudas, verifica este post, haz
clic aquí.
Veamos
el código que va dentro de nuestro botón.
Bien, la primera línea JasperReport, indica
el reporte que quiero abrir, en este caso mi reporte se llama mireporte.jrxml,
La siguiente línea, le
indicará al reporteador que va a imprimir, fijate que dentro de JasperFillManager.fillReport hay 3
parametros, te explico para que son, el primero está
indicando que reporte vamos a abrir, el segundo será los parametros que vamos a
pasar al reporte (por si la consulta (query) de tu reporte necesita valores
adicionales para ejecutarse, esto lo veremos en otro post) y el último
parámetro es la conexión a nuestra base de datos.
Las siguientes líneas:
viewer.setSize(1000,700); .- Indicamos el ancho y largo de nuestra ventana que contendrá el reporte.
viewer.setSize(1000,700); .- Indicamos el ancho y largo de nuestra ventana que contendrá el reporte.
viewer.setLocationRelativeTo(null);
.- Con este código centramos nuestra ventana en el monitor.
JRViewer jrv = new JRViewer(jasperPrint);
viewer.getContentPane().add(jrv); .- Con estas líneas se prepara el reporte para la vista previa.
viewer.setVisible(true);.- Con esta línea hacemos visible la ventana que tiene nuestro reporte
viewer.getContentPane().add(jrv); .- Con estas líneas se prepara el reporte para la vista previa.
viewer.setVisible(true);.- Con esta línea hacemos visible la ventana que tiene nuestro reporte
Ahora ejecuta tu JFrame,
clic derecho a tu JFrame – Run File..
Enlace de reporte con ventana JDialog. Uso de
JasperViewer - Ejemplos
JFrame,
JDialog y otras ventanas
Cuando queremos hacer ventanitas en java nos
encontramos con dos ventanas: El JFrame y
el JDialog.
¿Cuándo se usa una u otra?, ¿Qué diferencias hay entre ellas?
JDialog.
Un JDialog se construye de la misma manera que un JFrame la única diferencia es que hereda de la Clase JDialog...... cómo se mencionó anteriormente básicamente son ventanas pero tienen ciertas diferencias, la más notoria es que no posee los botones básicos de las ventanas ni pueden ser visualizados en la barra de tareas.
Un JDialog se construye de la misma manera que un JFrame la única diferencia es que hereda de la Clase JDialog...... cómo se mencionó anteriormente básicamente son ventanas pero tienen ciertas diferencias, la más notoria es que no posee los botones básicos de las ventanas ni pueden ser visualizados en la barra de tareas.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class VentanaConfirmacion
extends JDialog { private Container
contenedor; public VentanaConfirmacion(){ contenedor=getContentPane(); contenedor.setLayout(null); //Asigna
un titulo a la barra de titulo setTitle("CoDejaVu
: Titulo Del JDialog"); //tamaño
de la ventana setSize(300,200); //pone
la ventana en el Centro de la pantalla setLocationRelativeTo(null); } } |
Igual que El anterior, este código crea una ventana de dialogo Vacía, se llaman de dialogo por las características mencionadas que la diferencian de una ventana normal.
Si ejecutamos las 2 clases veremos estas diferencias.
Como vemos lo principal
en estos momentos es que la ventana que hereda de JFrame tiene
los botones básicos de toda ventana, además permite su visualización en la
barra de tareas, mientras que la ventana que hereda de JDialog no
posee estas características. JFrame y JDialog
Los dos tipos de ventanas principales que
tenemos en java son JFrame y JDialog. Hay varias
diferencias entre ellas y en función de estas diferencias vamos a ver para qué
sirven
- Si instanciamos
un JFrame,
en la barra de abajo de windows (creo que se llama "barra de
herramientas") nos aparece un nuevo "botoncito"
correspondiente a nuestra aplicación. Si instanciamos un JDialog, no
aparece nada.
- Un JFrame tiene
un método setIconImage() para
cambiar el icono por defecto de la taza de café. JDialog no
tiene este método.
- Un JDialog admite
otra ventana (JFrame o JDialog) como
padre en el constructor. JFrame no
admite padres.
- Un JDialog puede
ser modal, un JFrame no.
Todo esto nos indica lo siguiente:
- Un JFrame debe
ser la ventana principal de nuestra aplicación y sólo debe haber una.
- Las ventanas
secundarias de nuestra aplicación deben ser JDialog.
Los motivos de esto son los siguientes.
Al mostrar el JFrame un botón
en la barra de herramientas de windows y tener método para cambiar el icono, es
la ventana ideal como ventana principal de nuestra aplicación y sólo debe haber
una. Nos permite cambiar el icono y sólo debe haber un botón en la barra de
herramientas de windows para nuestra aplicación.
Si usamos un JDialog como
ventana principal, no tenemos botón en la barra de herramientas y no hay forma
fácil de cambiarle el icono.
Los JDialog son ideales para ventanas
secundarias porque admiten una ventana padre. Si la VentanaA es padre del
JDialogB, entonces el JDialogB siempre estará por delante de VentanaA, nunca
quedará por detrás. Lo ideal es que hagamos nuestras ventanas secundarias
como JDialog cuyo
padre sea el JFrame principal.
De esta forma los JDialogsiempre
serán visibles por encima del JFrame y
no se irán detrás ni quedarán ocultos por el JFrame.
Otra ventaja de admitir un padre es que
heredan el icono de él. Si hemos cambiado el icono del JFrame con el
método setIconImage(),
entonces todos los JDialog que
hagamos como hijos de este JFrame heredarán
el icono. Todas las ventanas de nuestra aplicación tendrán el mismo icono en
lugar de la taza de café por defecto.
Jerarquía de padres y ventanas
modales
Un JDialog puede ser modal, pasándole
un true en
el constructor en el sitio adecuado o haciéndolo modal con el método setModal(). Si hacemos
un JDialog modal,
todas las demás ventanas se deshabilitarán hasta que el usuario de nuestro
programa cierre el JDialog.
Esto está estupendo para pedir un dato al usuario y evitar que toque otras
cosas hasta que haya introducido el dato. Sin embargo, tiene un peligro.
Supongamos un JDialog que lo
hacemos modal para pedir unos datos al usuario. Este JDialog tiene un
botón de "Aceptar" para que el usuario lo pulse cuando haya terminado
de introducir los datos. Supongamos que en el código de ese botón "Aceptar"
comprobamos los datos que ha metido el usuario y vemos que son incorrectos. Le
sacamos un segundo JDialog modal
para indicarle el error y no cerramos el primero.
¿Quién debe ser el padre de ese segundo JDialog modal?.
Si hacemos que el padre sea el JFrame tendremos
dos JDialog modales
hijos del JFrame,
es decir, dos JDialogmodales
hermanos. Esto nos dará problemas, como que ambas ventanas queden
deshabilitadas, que al cerrar una de ellas se nos oculten todas, que parte de
la ventana quede deshabilitada mientras que otra parte no, etc.
Entonces, ¿cómo hacemos? Para que java no
haga cosas raras, el padre del segundo JDialog modal debe ser el
primer JDialog modal.
De esta forma, el segundo tiene "prioridad" sobre el primero. Todo
queda deshabilitado excepto este segundo JDialog. Cuando lo cerremos, será el
primero el que mande.
Resumiendo, si queremos varias ventanas
modales simultáneamente en pantalla, cada ventana que se muestre debe ser padre
de la siguiente, de forma que las cadenas de ventanas modales sean padres,
hijo, nieto, etc. Tener dos ventanas modales simultaneas que sean hermanas o
primas o cualquier otra relación que no sea directa, nos dará problemas.
Ejemplos
con el uso de JasperViewer
Ya teníamos un JFrame form donde abrimos un reporte
con una consulta SQL sencilla, ahora vamos a pasar el valor que tenga un
JTextField.
Para esto agreguemos a nuestro proyecto un campo de
texto JTextField, seleccionando nuestro JTextField, dale clic en Properties y
elimina el contenido de text, para que nuestro campo quede en blanco.
Después volvemos a dar clic sobre el botón para ir
al código que ejecuta el botón.
Observa el nuevo código que marco y te lo explico.
Primero, observa que al proyecto se agregaron 2
librerías:
import java.util.HashMap;
import java.util.Map;
import java.util.HashMap;
import java.util.Map;
Después verifica que
La Interface Map en Java, nos permite representar
una estructura de datos para almacenar pares “clave/valor”; de tal manera
que para una clave solamente tenemos un valor., entonces primero damos de alta
una variable de tipo Map que se llama parámetros, y luego con put, agregamos
una clave/valor, en este caso mi clave que va a identificar el valor de mi
JTextField es usuarioLog y este mismo nombre ocuparemos para dar de alta un
parametro en mi reporte y el valor que va a tener esa clave obviamente es el
contenido de mi JTextField, que recogemos con getText();
Después, para mandar los parámetros lo vamos hacer
desde la línea JasperFillManager.fillReport, fíjate que ahora
pasamos como parámetro la variable de tipo Map que se llama parámetros y ya no
esta el null.
De aqui es todo, ahora, para ocupar el
valor que estamos mandando al reporte, nos vamos a nuestro reporte en IReports,
clic derecho al nombre de nuestro reporte y elegimos Edit Query…
Ahora vamos a dar de alta el parámetro que recibirá
el valor que enviamos de nuestro proyecto, para esto haz clic en el botón New
Parameter…
Aparecerá una ventana que te pide el nombre del
parámetro que vas a crear, el nombre del parámetro será el nombre de la clave
que elegiste para guardar tu valor, para el caso del ejemplo es usuarioLog…,
haz clic en ok.
Ya tenemos nuestro nuevo parámetro que recibirá el
valor que estamos enviando desde nuestro proyecto JAVA.
Vamos hacer nuestra consulta un poco mas compleja,
vamos a pedir a los usuarios que su campo usuario contenga
“VEN”, la consulta quedaría así, observa como queda la consulta…
Bien, atiende a lo siguiente: estoy usando el
operador like en mi consulta, que indica que dentro de lo que haya en los
signos de porcentaje (‘%%’) buscará coincidencia en el campo usuario, observa
que dentro de los porcentajes metí el parámetro que creamos, esto lo hice
arrastrándolo dentro de los porcentajes, nota también que entre la P y
el paréntesis de apertura hay un símbolo de exclamación (!), ese no lo pone el
sistema, lo tienes que poner tu manualmente, si no, el parámetro no funciona.
Guarda los cambios y a probar lo que hemos hecho,
corre form de muestraReporte, clic derecho sobre el JFrame form elige run file…
Ahora en el campo de texto pongo una parte del
texto que quiero buscar para que mi consulta que está en mi reporte llene el
mismo.
Ya tenemos un reporte dinámico.
2. Resumen
Jasper Report es una
librería para la generación de informes. Está escrita en java y es libre. El
funcionamiento consiste en escribir un xml donde se
recogen las particularidades del informe. Este XML lo tratan las clases del
Jasper para obtener una salida que pueden ser un PDF, XML, HTML, CSV, XLS, RTF,
TXT.
Para generar el XML, o el
compilado. Jasper les recomiendo descargar la herramienta iReport que es un
Entorno Gráfico que está implementado en java y se integra perfectamente con el
Jasper Report.
Aunque
JasperReports se utiliza principalmente para capacidades de reporte a las
aplicaciones basadas en la Web a través de la API de Servlet, no tiene
absolutamente ninguna dependencia de la API Servlet o cualquier otra biblioteca
de Java EE. No hay nada que nos impida la creación de aplicaciones de
escritorio Java para generar informes con JasperReports.
JasperReports
nos permite separar los datos en secciones. Estas secciones incluyen:
·
El
título del informe, que aparecerá una vez en la parte superior del informe.
·
Un
encabezado de página, que aparecerá en la parte superior de cada página.
·
Una
sección de detalle, que normalmente contiene los datos de los informes
primarios.
·
A
pie de página, que aparecerá en la parte inferior de cada página.
·
Una
sección de resumen, que aparecerá al final del informe.
3. Summary
Jasper Report is a library for the generation of reports. It is written
in java and is free. The operation consists of writing an xml where the
particularities of the report are collected. This XML is treated by the Jasper
classes to obtain an output that can be PDF, XML, HTML, CSV, XLS, RTF, TXT.
To generate the XML, or the compiled one. Jasper, I recommend you
download the iReport tool, which is a Graphical Environment that is implemented
in java and integrates perfectly with the Jasper Report.
Although JasperReports is primarily used for reporting capabilities to
Web-based applications through the Servlet API, it has absolutely no dependency
on the Servlet API or any other Java EE library. There is nothing stopping us
from creating Java desktop applications to generate reports with JasperReports.
JasperReports allows us to separate the data into sections. These
sections include:
• The title of the report, which will appear once at the top of the
report.
• A page header, which will appear at the top of each page.
• A detail section, which normally contains the data of the primary
reports.
• Footnote, which will appear at the bottom of each page.
• A summary section, which will appear at the end of the report.
4. Conclusiones
ü Poco a poco vamos viendo nuevas funcionalidades de
jasperReport/iReport, que los hacen unas herramientas muy potentes a la hora la
generación de informes dinámicos. Con cada nueva release se hacen cada vez más
dinámicos y más fáciles de manejar.
ü Es muy util para general reportes. Para conyevar a un
mejor manejo de propuestas de negocios y nos permite tener un orden especifico.
5. Apreciación del Equipo
Ø Es importante
conocer jasperReport/iReport ya que nos permite crear reportes de diversos
tipos.
Ø Nos ayuda a conocer la informacion almacenada en una base
de datos mucho mas ordenado.
Ø Cuando creamos nuestros sistemas en diferentes lenguajes
de programacion necesitamos y requerimos ver los reportes de los movimientos
que se generan en el sistema es por ello que gracias a la libreria JasperReport
se nos hace mas facil generar reportes en varios tipos de formato como
pdf,txt,html entre otras
con pocas lineas de codigo de tal manera
que mostremos nuestra informacion requerida de forma ordenada y especifica.
Ø este
tema de jasperreport fue muy importante para nosotros ya que nos ayudo a crear
reportes para nuestro proyecto final
de una manera no muy complicada y
entendible e incluso tambien pudimos realizar campos calculados como una
suma,etc.fue de muy
buena utilidad.
6. Glosario de Términos
Xml: (Extensible
Markup Language) es un lenguaje de etiquetas, es decir, cada paquete de
información está delimitado por dos etiquetas como se hace también en el
lenguaje HTML, pero XML separa el contenido de la presentación.
HTML: Es el
lenguaje que se emplea para el desarrollo de páginas de internet. Está
compuesto por una serie de etiquetas que el navegador interpreta y da forma en
la pantalla
Plugin: En
informática, un complemento o plug-in es una aplicación que se relaciona con
otra para agregarle una función nueva y generalmente muy específica.
Datasources: Tienen un
conjunto de propiedades que identifica y describe el origen de datos que
representa. Estas propiedades incluyen información como la ubicación del
servidor de la base de datos, el nombre de la base, y el protocolo de red para
comunicarse
Archivo
jrxml:
Estos archivos se conocen como JasperReports Layout archivos que
contienen definiciones de diseños de informes guardados en XML formato.
JDBC:
Java
Database Connectivity, más conocida por sus siglas JDBC, es una API que
permite la ejecución de operaciones sobre bases de datos desde el lenguaje de
programación Java.
7. Linkografías
Øhttps://www.google.com.pe/search?q=instalar+plugin+ireport+netbeans&sa=X&ved=0ahUKEwihlb2gsvHXAhWFYd8KHaEeDKcQ1QIIZigC&biw=1366&bih=662
Øhttp://www.javapuntes.com/informes-instalacion-de-jasperreports-y-plugin-ireport-en-netbeans/
Ø
https://jossjack.wordpress.com/2014/06/15/jasperreport-ireport-en-netbeans/
Ø
http://plugins.netbeans.org/plugin/4425/ireport
Ø
https://www.adictosaltrabajo.com/tutoriales/odbc-ireport/
Ø
https://www.adictosaltrabajo.com/tutoriales/datasources-jasper-reports/
Ø
https://www.adictosaltrabajo.com/tutoriales/java-bean-datasource/
Ø
http://www.javatutoriales.com/2009/04/creacion-de-reportes-con-jasperrepots-y_18.html
Ø
http://www.javatutoriales.com/2009/03/creacion-de-reportes-con-jasperrepots-y_30.html
Ø
http://www.elprogramador.com.mx/ejecutar-un-reporte-desde-netbeans/
Ø
http://www.chuidiang.org/java/novatos/JFrame_JDialog.php
Ø
http://codejavu.blogspot.pe/2013/08/jframe-y-jdialog.html
No hay comentarios:
Publicar un comentario