Clase Ejemplo para hacer reportes con JFreeReport

Jobev Lee
04 de Diciembre del 2007
Hola, jejeje, bueno he hecho mucho uso de los recursos de este foro pero creo que es hora de que colabore, quisiera saber si alguien me puede decir como puedo enviar un Tutorial que he hecho sobre este tema.??? Aunque eso es tema de otro costal...

Para los que no le entienden ni un C... al XML y a los que les gusta las cosas por codigo, esta es una clase que pueden usar para Generar Reportes en JFreeReport, usando puro hard core, pero lo bonito es que "Sale con formato...", pruebenlo y cualquier consulta... pos aqui estoy para servirlos...

package software_I.reportes;

/**
* Título: Proyecto2 de Software I
* Descripcion: Elaborar una aplicacion que maneje consultas QBE
* Copyright: Copyright (c) 2005
* Empresa: UAGRM
* @author Jesús Barbery Vargas
* @version 1.0
*/

/*
Librerias usadas para la generacion del reporte
*/
import java.util.Vector;
import java.util.Enumeration;
import java.util.Calendar;

import java.awt.Color;
import java.awt.geom.Point2D;
import java.awt.Dimension;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import org.jfree.report.*;
import org.jfree.report.elementfactory.*;
import org.jfree.report.function.*;
import org.jfree.report.style.*;
import org.jfree.report.modules.gui.base.PreviewDialog;
import org.jfree.report.util.Log;
import org.jfree.ui.FloatDimension;

import java.sql.ResultSet;
import java.sql.SQLException;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;

/**
* Clase utilizada para la generación de reportes en JFreeReport usando solo
* instrucciones API para crear el formato del Reporte a partir de una
* estructura QBE.
*/
public class Reporte {

private TableModel oData;
private JFreeReport oReporte;
private ResultSet oDatos;

public Reporte(ResultSet loDatos) {
oDatos = loDatos;
oReporte = new JFreeReport();
oReporte.setName("Reporte QBE Generado");
}

private void crearTabla()throws Exception
{
int liColCount = oDatos.getMetaData().getColumnCount();

//ARMAR LA TABLA
Vector lvColumNames = new Vector();
Vector lvDatos = new Vector();
Vector lvRow;
String lsValor, lsTipo;

for(int i = 0; i < liColCount; i++)
{
lsValor = oDatos.getMetaData().getColumnName(i+1);
lvColumNames.add(lsValor);
}

while(oDatos.next())
{
lvRow = new Vector();
for(int col = 0; col < liColCount; col++)
{
if (oDatos.getObject(col + 1) == null)
{
lvRow.add(null);
}else
{
lsTipo = oDatos.getMetaData().getColumnClassName(col + 1);
if (lsTipo.equals("java.lang.Long"))
{
lsValor = Long.toString(oDatos.getLong(col + 1));
}else if (lsTipo.equals("java.sql.Timestamp"))
{
lsValor = oDatos.getDate(col + 1).toString();
}else if (lsTipo.equals("java.lang.String"))
{
lsValor = oDatos.getString(col + 1).trim();
}else
{
lsValor = oDatos.getString(col + 1);
}

lvRow.add(lsValor);
}
}
lvDatos.add(lvRow);
}

oData = new DefaultTableModel(lvDatos, lvColumNames);
}

private void definirDatos()throws Exception
{
crearTabla();
oReporte.setData(oData);

/**Agrega campo Numero de Pagina**/
PageFunction loFunction = new PageFunction("num_Pag");
oReporte.addExpression(loFunction);
}


private PageHeader crearCabeceraPagina()
{
PageHeader loResult = new PageHeader();
loResult.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE,
new FloatDimension(0, 18));

LabelElementFactory lblElemento = new LabelElementFactory();
lblElemento.setAbsolutePosition(new Point2D.Float(0, 0));
lblElemento.setFontName("Arial");
lblElemento.setFontSize(new Integer(10));
lblElemento.setBold(new Boolean(true));
lblElemento.setColor(Color.black);
lblElemento.setHorizontalAlignment(ElementAlignment.LEFT);
lblElemento.setMinimumSize(new FloatDimension(-100, -100));
lblElemento.setText("Gestion de Personal de la Empresa X");

loResult.addElement(lblElemento.createElement());


NumberFieldElementFactory fldPagina = new NumberFieldElementFactory();
fldPagina.setAbsolutePosition(new Point2D.Float(0, 0));
fldPagina.setMinimumSize(new Dimension(-100, -100));
fldPagina.setColor(Color.black);
fldPagina.setHorizontalAlignment(ElementAlignment.RIGHT);
fldPagina.setFormatString("Pag 0");
fldPagina.setFieldname("num_Pag");
fldPagina.setFontName("Arial");
fldPagina.setFontSize(new Integer(10));
fldPagina.setBold(new Boolean(true));

loResult.addElement(fldPagina.createElement());

loResult.addElement(StaticShapeElementFactory.createLineShapeElement
(null, Color.gray, new BasicStroke(1), new Line2D.Float(0, 11, 0, 11)));

return loResult;
}

private PageFooter crearPiePagina()
{
PageFooter loResult = new PageFooter();

loResult.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE,
new FloatDimension(0, 18));

LabelElementFactory lblElemento = new LabelElementFactory();
lblElemento.setAbsolutePosition(new Point2D.Float(0, 2));
lblElemento.setFontName("Arial");
lblElemento.setFontSize(new Integer(10));
lblElemento.setBold(new Boolean(true));
lblElemento.setColor(Color.black);
lblElemento.setHorizontalAlignment(ElementAlignment.LEFT);
lblElemento.setMinimumSize(new FloatDimension(-100, -100));
lblElemento.setText("Reporte Generado por QBE");

loResult.addElement(lblElemento.createElement());

lblElemento.setHorizontalAlignment(ElementAlignment.RIGHT);
lblElemento.setText( "[" + Calendar.getInstance().getTime().toString() + "]");

loResult.addElement(lblElemento.createElement());

loResult.addElement(StaticShapeElementFactory.createLineShapeElement
(null, Color.gray, new BasicStroke(1), new Line2D.Float(0, 0, 0, 0)));

return loResult;
}

private ReportHeader crearCabeceraReporte()
{
ReportHeader loResult = new ReportHeader();

loResult.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE,
new FloatDimension(0, 30));

LabelElementFactory lblElemento = new LabelElementFactory();
lblElemento.setAbsolutePosition(new Point2D.Float(0, 2));
lblElemento.setFontName("Impact");
lblElemento.setFontSize(new Integer(18));
lblElemento.setBold(new Boolean(true));
lblElemento.setUnderline(new Boolean(true));
lblElemento.setItalic(new Boolean(true));
lblElemento.setColor(Color.black);
lblElemento.setHorizontalAlignment(ElementAlignment.CENTER);
lblElemento.setVerticalAlignment(ElementAlignment.MIDDLE);
lblElemento.setMinimumSize(new FloatDimension(-100, 18));
lblElemento.setText("Resultado de la Consulta");

loResult.addElement(lblElemento.createElement());

return loResult;
}

private ReportFooter crearPieReporte()
{
ReportFooter loResult = new ReportFooter();

loResult.getStyle().setStyleProperty(ElementStyleSheet.MINIMUMSIZE,
new FloatDimension(0, 12));

LabelElementFactory lblElemento = new LabelElementFactory();
lblElemento.setAbsolutePosition(new Point2D.Float(0, 2));
lblElemento.setFontName("Times New Roman");
lblElemento.setFontSize(new Integer(12));
lblElemento.setBold(new Boolean(true));
lblElemento.setItalic(new Boolean(true));
lblElemento.setColor(Color.black);
lblElemento.setHorizontalAlignment(ElementAlignment.CENTER);
lblElemento.setMinimumSize(new FloatDimension(-100, 20));
lblElemento.setText("Fin de la Generación del Reporte");

loResult.addElement(lblElemento.createElement());

loResult.addElement(StaticShapeElementFactory.createLineShapeElement
(null, Color.black, new BasicStroke(0.1f),
new Line2D.Float(0, 0, 0, 0)));

return loResult;
}

private ItemBand crearDetalleReporte()
{
ItemBand loResult = new ItemBand();

TextFieldElementFactory fldDato = new TextFieldElementFactory();
LabelElementFactory lblDato = new LabelElementFactory();

//ARMANDO LA ETIQUETA
lblDato.setColor(Color.black);
lblDato.setFontSize(new Integer(10));
lblDato.setFontName("Courier");
lblDato.setBold(new Boolean(true));
lblDato.setMinimumSize(new FloatDimension(100, 11));
lblDato.setHorizontalAlignment(ElementAlignment.RIGHT);
lblDato.setVerticalAlignment(ElementAlignment.TOP);

//ARMANDO LOS DATOS
fldDato.setColor(Color.black);
fldDato.setFontSize(new Integer(10));
fldDato.setFontName("Courier");
fldDato.setMinimumSize(new FloatDimension(-100, 11));
fldDato.setHorizontalAlignment(ElementAlignment.LEFT);
fldDato.setVerticalAlignment(ElementAlignment.TOP);
fldDato.setNullString("-");

for (int liCol = 0; liCol < oDatos.getMetaData().getColumnCount(); liCol++)
{
//LLENANDO LA ETIQUETA
lblDato.setAbsolutePosition(new Point2D.Float(0, (liCol * 10) + 2));
lblDato.setText(oDatos.getMetaData().getColumnLabel(liCol + 1) + ":");

//LLENANDO LOS DATOS
fldDato.setAbsolutePosition(new Point2D.Float(145, (liCol * 10) + 2));
fldDato.setFieldname(oDatos.getMetaData().getColumnName(liCol + 1));

//AGREGANDO LOS COMPONENTES
loResult.addElement(lblDato.createElement());
loResult.addElement(fldDato.createElement());
}

return loResult;
}


public void mostrarVistaPreliminar()throws Exception
{
definirDatos();

oReporte.setPageHeader(crearCabeceraPagina());
oReporte.setPageFooter(crearPiePagina());

oReporte.setReportHeader(crearCabeceraReporte());
oReporte.setReportFooter(crearPieReporte());

oReporte.setItemBand(crearDetalleReporte());

PreviewDialog dialogo = new PreviewDialog(oReporte);

dialogo.setModal(true);
dialogo.pack();
dialogo.setSize(600, 500);
dialogo.show();
dialogo.requestFocus();
}

}


Maite
04 de Diciembre del 2007
Estoy desesperada buscando alguna librería que exporte mis archivos .rtf a .pdf manteniendo el formato. ¿JFreeReport no permite esa trasnsformacion? Por lo que he visto solo permite cargar datos de tablas. Si es posible, ruego que me digais como. Y si sabeis de alguna libreria que lo permite también!! He probado con muchas y ya no se que hacer... Gracias

Ferran
04 de Diciembre del 2007
Buenas,

Soy nuevo con esto del java y el jfree, y me ha surgillo un problemilla.

Añadí la clase con el código indicado, y obtuve el ResultSet tras conectar con mi base de datos.
Mi problema surge, en que no sé como pasarle este ResultSet al constructor desde mi JSP para poder ejecutar el programa. ¿Alguna idea?.

Mersi x adelantado.

Jobev Lee
04 de Diciembre del 2007
Bueno, pára empesar te adelanto, que no creo que funcione para una pagina jsp, ya que todas sus implementaciones son para trabajar sobre los controles AWT...

La verda, no creo que te sirva para lo que queres hacer, a menos que lo que podes hacer es hacer ejecutar una aplicacion java sobre el lado del cliente en el momento que se requiera el reporte, pero a eso, te recomendaria que elaboraras tus reportes sobre la misma pagina jsp.. usando HTML y javascript...

Vas a disculpar si no es de mucha ayuda lo que te doy...

Atte.

Jobev Lee

Jobev Lee
04 de Diciembre del 2007
Ups... Hacer caso omiso al comentario que hace Referencia a QBE, son letritas que se me escaparon, de todas formas OJO.- es una clase para ser utilizada, asi que (No le busquen el MAIN), y genera el reporte a partir de un ResultSet....

Chau y espero que os sirva

nachoep
04 de Diciembre del 2007
He usado tu clase y me genera los reportes genial, pero no logro entenderla bien. Podrías decirme u orientarme acerca de cómo cambiar el formato del reporte?, es decir, quiero el típico reporte en el que la primera fila sean los nombres de los atributos y a partir de ahí cada fila sea una tupla del resultSet. Gracias de antemano.

zamby
04 de Diciembre del 2007
Cuando creo...

PreviewDialog dialog=new PreviewDialog(oReporte);

Justo en esta linea me salta la excepcion no se porque razon falla y ademas tengo el problema de que en el constructor de PreviewDialog pasas el oReporte y este engloba muchisimas tareas en toda la clase...AYUDA!!!POR FAVOR!

ivi
04 de Diciembre del 2007
Hola q tal? aqui con unas preguntas, la version de JfreeReport q baje no tiene todas las opciones que tiene la clase q publicaste aqui, quisiera saber si no me puedes enviar el link de donde la descargaste? o si puedes enviarme el .jar; gracias!

mi correo es: [email protected]