Gráfico Pie y de Barras con JFreeChart

Primero necesitaremos las siguientes librerías:

jfreechart-1.0.13.jar

jcommon-1.0.16.jar

 

Si tienes JasperReports, esas librerías ya se incluyen en la carpeta “lib” (en el directorio donde tengas descomprimido JasperReports).

 

El siguiente ejemplo consta de la gráfica pie que indicará la cantidad de taxis disponibles y no disponibles (ocupados), y además de un gráfico de barras que indica el progreso de los taxis (que cantidad de carreras han hecho) según pasan los días.

 

1. Creamos un nuevo proyecto, para el ejemplo, basta un “Java Application”. El proyecto tendrá de nombre “PieChart”.

 

2. Añadimos las dos librerías mencionadas al inicio, dando clic derecho a “Bibliotecas” y eligiendo “Agregar archivo JAR/Carpeta” del menú desplegable.

image

 

3. En el código ya de nuestro programa, añadimos la siguiente función:

//crea un frame donde se encuentra el gráfico
static ChartFrame mostrarGrafico(JFreeChart grafico, String titulo)
{
    ChartFrame frame=new ChartFrame(titulo,grafico);
    frame.pack();
    frame.setVisible(true);
    return frame;
}

 

Deberemos reparar las importaciones de ser necesario (Clic derecho – Reparar importanciones).

 

4. Añadir el siguiente código al main para crear la gráfica tipo pie:

//Datos del gráfico
DefaultPieDataset datos = new DefaultPieDataset();
datos.setValue("Ocupados",450);
datos.setValue("Disponibles",200);
//se pueden seguir añadiendo más datos y la gráfica los acomodará en porcentajes

JFreeChart graficoPie = ChartFactory.createPieChart3D(
                   "Total de Taxis", //título del gráfico
                   datos,            //datos
                   true,             //mostrar leyendas
                   true,             //mostrar tooltips
                   false);           //Locale, sin gran importancia

mostrarGrafico(graficoPie,"Gráfico Pie");

 

Reparar importaciones de ser necesario.

Si deseas un gráfico sin diseño 3D puedes usar en vez de createPieChart3D, usas createPieChart.

 

5. Añadir el siguiente código al main para crear una gráfica tipo barras:

//datos del gráfico
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
String taxi1 = "Taxi 1";
String taxi2 = "Taxi 2";

String dia1 = "Día 1";
String dia2 = "Día 2";
String dia3 = "Día 3";
String dia4 = "Día 4";

dataset.addValue(18, taxi1,dia1);
dataset.addValue(15, taxi1,dia2);
dataset.addValue(16, taxi1,dia3);
dataset.addValue(12, taxi1,dia4);

dataset.addValue(16, taxi2,dia1);
dataset.addValue(19, taxi2,dia2);
dataset.addValue(10, taxi2,dia3);
dataset.addValue(11, taxi2,dia4);

JFreeChart graficoBarras = ChartFactory.createBarChart(
         "Uso de los Taxis",        //Título de la gráfica
         "Días de labor",           //leyenda Eje horizontal
         "Número de carreras",      //leyenda Eje vertical
         dataset,                   //datos
         PlotOrientation.VERTICAL,  //orientación
         true,                      //incluir leyendas
         true,                      //mostrar tooltips
         true);                   

graficoBarras.setBackgroundPaint(Color.LIGHT_GRAY);

CategoryPlot plot =(CategoryPlot) graficoBarras.getPlot();
plot.setBackgroundPaint(Color.CYAN); //fondo del grafico
plot.setDomainGridlinesVisible(true);//lineas de rangos, visibles
plot.setRangeGridlinePaint(Color.BLACK);//color de las lineas de rangos

mostrarGrafico(graficoBarras,"Gráfico de barras");

 

Reparar importaciones de ser necesario.

 

Si deseas un gráfico con diseño 3D (sencillo) puedes usar en vez de createBarChart, usas createBarChart3D.

 

6. Correr el programa (F6).

image

image



Reportes en java con JasperReports y iReports

Con motivo de estreno de este nuevo blog y además con un objetivo de facilitar mucho la programación en cuanto a generar reportes, aquí va un tutorial que les será de gran ayuda.

En lo que nos centraremos en este tutorial es en la creación de un reporte en formato PDF, previamente diseñando una plantilla mediante iReport. Se usará una lista enlazada (LinkedList) como origen de los datos a mostrar y se trabajará en el entorno NetBeans.

Primero necesitaremos de lo siguiente:
- JasperReports
- iReport (diseñador gráfico de plantillas para JasperReports)
NOTA: Es recomendable usar la misma versión de JasperReports que la de iReports caso contrario pueden dar errores el ejecutar el programa.

Configuración de NetBeans

Configuraremos NetBeans para que nos permita usar todas las librerías de JasperReports en nuestros proyectos.

Primero descomprimimos el archivo que descargamos de JasperReports, pues usaremos varias de sus librerías localizadas en las carpetas dist y lib.

Iremos al menú Herramientas – Bibliotecas.
toolsmenu

Creamos una nueva Biblioteca de nombre JasperReports (aunque puedes elegir el nombre que desees).
newlibrary

En la parte derecha damos presionamos en “Agregar archivo JAR/Carpeta…” para agregar los siguientes archivos (ubicados en las carpetas lib y dist de JasperReports como mencionamos anteriormente):

  • - jasperreports-3.7.5.jar
  • - jasperreports-javaflow-3.7.5.jar
  • - commons-beanutils-1.8.0.jar
  • - commons-collections-2.1.1.jar
  • - commons-digester-1.7.jar
  • - commons-javaflow-10060411.jar
  • - iText-2.1.7.jar
  • - png-encoder-1.5.jar
  • - poi-3.6.jar
  • - commons-logging-1.0.4.jar
  • - groovy-all-1.5.5.jar

Con esto bastará solo agregar la biblioteca JasperReports (o el nombre que le hayamos puesto) al proyecto en el cual deseemos generar reportes.

Creación de un nuevo proyecto de prueba

Lo que se realizará es un ejemplo de una clase Empleado que dispone de una cédula, un nombre y el sueldo.

Primero vamos al menú Archivo – Nuevo Proyecto – Java – Aplicación Java.
selectproject

Al proyecto le pondremos de nombre “ReporteEmpleados”.

Ahora creamos una nueva clase a la cual llamaremos Empleado.
new class

Le añadimos todos los Setters y Getters correspondientes además del constructor, quedando al final como sigue:

Tenemos lo básico, ahora diseñaremos el reporte con iReport

Diseño de la plantilla con iReport

Una vez abierto iReport, para crear una nueva plantilla nos dirigimos al menú Archivo – New. En la nueva ventana elegimos “Blank A4” y presionamos en “Open this template”.

new report dlg

Damos un nombre a nuestro reporte, dejaremos de momento el que trae por defecto “report1”.

Dispondremos de 8 secciones en nuestro reporte:
- Title: Para colocar el título del reporte, irá en la primera página.
- Page Header: Una cabecera que irá en cada página
- Column Header: Las etiquetas de las cabeceras de cada columna.
- Detail 1: Los datos en sí del reporte.
- Column Footer: Para colocar información al final de los datos.
- Page Footer: Sección inferior de la página.
- Summary
- Background: Un fondo

Ahora nos dispondremos a añadir información, en la parte derecha encontraremos la paleta de elementos que podremos agregar (si no aparece ir al menú Ventana – Paleta).

Para el título seleccionamos “Static Text” y lo arrastramos a la sección “Title”. Una vez que el elemento esté en la página, si le damos doble clic podremos cambiar su texto, además de la fuente, el tamaño, entre otros.



Ahora añadimos las columnas de los datos que vamos a mostrar, o sea añadimos más “Static Text” para indicar la cédula, el nombre y el sueldo.



Ahora estamos listos para añadir campos donde irán los datos, mucha atención a lo siguiente…
Anteriormente añadimos texto estático (que no cambia) pero los datos de cada empleado como sabemos cambia, no serán los mismos, entonces necesitaremos de un campo dinámico.

Los campos dinámicos tenemos varios como son:
- Fields: Sirven para mostrar información provenientes de un DataSource (que puede ser una base de datos o una lista ligada).
- Variables: Muestran información del reporte o cálculos. Las variables disponibles las puedes encontrar aquí.
- Parámetros: Son datos que por lo general son pasados desde el programa. Algunos de los parámetros solo se pueden leer y no modificar, aquí la lista completa.

Nosotros usaremos Fields, entonces en la parte izquierda de iReport damos clic derecho sobre Fields y elegimos Agregar Field.
add field

Cada Field tiene un tipo de dato que por defecto es String, pero en nuestro caso donde el sueldo es de tipo Integer, entonces elegimos java.lang.Integer como Field Class en las propiedades del Field.
select integer

Ahora arrastramos cada field hacia “Detail 1”. Seguramente en la sección “Column Header” de la hoja se te crearon más etiquetas, las puedes eliminar tranquilamente. Además debes achicar la altura de “Detail 1” puesto que ese espacio es el que usará una sola fila y por el que viene por defecto es bastante grande. Una vez realizado estos cambios el resultado podría quedar como sigue:



Y aunque no lo creas, ya tenemos lista nuestra plantilla, sencillita por cierto, pero a la final la creamos nosotros mismos. Ahora solo damos clic en Preview:



Esto compilará la plantilla para generar el archivo report1.jasper el cual es el que haremos referencia en el código. Dicho archivo lo debemos colocar en la raíz de nuestro proyecto.

Nos aparece los datos como “null” debido a que no existe una fuente de información (un DataSource), pero no te preocupes que en nuestro programa lo vamos a indicar.

Completando el ejemplo de la clase Empleado

Habíamos dejado solo definida la clase Empleado con sus atributos y métodos respectivos, ahora estamos listos para crear el reporte.

Primero damos clic derecho a la carpeta “Bibliotecas” de nuestro proyecto, elegimos “Agregar Biblioteca”.
addnewlibrary
De la lista de bibliotecas, seleccionamos el que habíamos creado, o sea “JasperReports”.
jasperreportsselected

En el main de nuestro proyecto añadiremos el siguiente código

LinkedList<Empleado> listaEmpleados = new LinkedList<Empleado>();
listaEmpleados.add(new Empleado("1234567890", "Juan Pérez", 450));
listaEmpleados.add(new Empleado("0987654321", "Marcelo C", 500));
listaEmpleados.add(new Empleado("1234509876", "Don Bill", 5000));
try
{
    JasperReport reporte = (JasperReport) JRLoader.loadObject("report1.jasper");
    JasperPrint jasperPrint = JasperFillManager.fillReport(reporte, null, new JRBeanCollectionDataSource(listaEmpleados));
    JRExporter exporter = new JRPdfExporter();
    exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File("reporteEnPdf.pdf"));
    exporter.exportReport();
}
catch(JRException e)
{
    e.printStackTrace();
}

Seguramente al pegar el código faltarán algunos imports, esto se soluciona dando clic derecho sobre el código que da error y eligiendo “Reparar importaciones”.
fiximports

Ahora si ejecutamos el programa (presionando F6 en NetBeans) y… ¡voilá! tenemos nuestro reporte en PDF, excelente ¿no?.
Para cualquier duda o sugerencia, la puedes dejar en los comentarios.