En este post vamos a ver como se pasan parámetros desde java al reporte sin necesidad de una conexión a una BBDD, es decir, podemos pasar los parámetros que queramos.
Vamos a comenzar creando un proyecto nuevo (File/New Project) y una clase en java que utilizaremos para instanciar objetos ( botón derecho en el paquete y New/java Class) y así pasar los datos al datasource. Para usar de ejemplo, hemos creado la clase Asistentes.
public class Asistentes {
private Integer id;
private String nombre;
private String apellidos;
private String dni;
public Asistentes(){
}
public Asistentes(int id, String nombre, String apellidos, String dni) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.dni = dni;
}
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
private Integer id;
private String nombre;
private String apellidos;
private String dni;
public Asistentes(){
}
public Asistentes(int id, String nombre, String apellidos, String dni) {
this.id = id;
this.nombre = nombre;
this.apellidos = apellidos;
this.dni = dni;
}
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getApellidos() {
return apellidos;
}
public void setApellidos(String apellidos) {
this.apellidos = apellidos;
}
public String getDni() {
return dni;
}
public void setDni(String dni) {
this.dni = dni;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
}
Esta clase tiene cuatro atributos, constructor por defecto y constructor parametrizado. También debemos incluir los getters and setters ya que los atributos son privados y necesitaremos asignar esos valores.
A continuación vamos a crear el reporte. Para ello botón derecho en el paquete y nuevo Empty report.
Para editar el reporte vamos a utilizar el programa de iReport, que previamente lo tenemos que tener instalado ( a parte del plugin de iReport para netbeans). Os lo podéis descargar del siguiente enlace:
En nuestro reporte vamos a asignar etiquetas para las columnas y para el nombre del reporte. Esto se hace con Static Text (Paleta que está a la derecha).
Una vez creados todos, pinchamos y los arrastramos al reporte. Así quedaría el nuestro:
Muy bien, ahora hay que crear la clase para pasar estos datos. Esta clase tiene que implementar la clase JRDataSource, y tiene dos métodos que son obligatorios sobreescribir, el método next() y getFieldValue(JRField jrf). En el método next incrementará el contador y JasperReport sabrá cuantos Asistentes van a existir. El método getFieldValue asignará los valores a los Fields correspondientes.
A parte en esta clase vamos a crear una variable que será una lista de Asistentes y también un método para ir agregando cada asistente a la lista. La clase quedaría así:
public class AsistentesDataSource implements JRDataSource{
private List<Asistentes> listaAsistentes = new ArrayList<Asistentes>();
private int indiceParticipanteActual = -1;
@Override
public boolean next() throws JRException {
return ++indiceParticipanteActual < listaAsistentes.size();
}
public void addAsistente(Asistentes Asistente){
this.listaAsistentes.add(Asistente);
}
@Override
public Object getFieldValue(JRField jrf) throws JRException {
Object valor = null;
if ("id".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getId();
}
else if ("nombre".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getNombre();
}
else if ("apellidos".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getApellidos();
}
else if ("dni".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getDni();
}
return valor;
}
}
private List<Asistentes> listaAsistentes = new ArrayList<Asistentes>();
private int indiceParticipanteActual = -1;
@Override
public boolean next() throws JRException {
return ++indiceParticipanteActual < listaAsistentes.size();
}
public void addAsistente(Asistentes Asistente){
this.listaAsistentes.add(Asistente);
}
@Override
public Object getFieldValue(JRField jrf) throws JRException {
Object valor = null;
if ("id".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getId();
}
else if ("nombre".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getNombre();
}
else if ("apellidos".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getApellidos();
}
else if ("dni".equals(jrf.getName())){
valor = listaAsistentes.get(indiceParticipanteActual).getDni();
}
return valor;
}
}
En el main() tenemos que inicializar jasperreport y la clase Asistentes. También crear los objetos y pasarlos al datasource además de crear el reporte. El método main() quedaría de la siguiente forma:
public static void main(String[] args) {
// TODO code application logic here
InputStream inputStream = null;
JasperPrint jasperPrint= null;
AsistentesDataSource datasource = new AsistentesDataSource();
for(int i = 0; i<=5; i++){
Asistentes asist;
asist = new Asistentes(i, "AsistenteNombre de "+i,"AsistenteApellidos de "+i, "Asistente dni de "+i);
datasource.addAsistente(asist);
}
try {
inputStream = new FileInputStream ("src/reportes/reporte01.jrxml");
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(null,"Error al leer el fichero de carga jasper report "+ex.getMessage());
}
try{
JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "src/reportes/reporte01.pdf");
}catch (JRException e){
JOptionPane.showMessageDialog(null,"Error al cargar fichero jrml jasper report "+e.getMessage());
}
}
// TODO code application logic here
InputStream inputStream = null;
JasperPrint jasperPrint= null;
AsistentesDataSource datasource = new AsistentesDataSource();
for(int i = 0; i<=5; i++){
Asistentes asist;
asist = new Asistentes(i, "AsistenteNombre de "+i,"AsistenteApellidos de "+i, "Asistente dni de "+i);
datasource.addAsistente(asist);
}
try {
inputStream = new FileInputStream ("src/reportes/reporte01.jrxml");
} catch (FileNotFoundException ex) {
JOptionPane.showMessageDialog(null,"Error al leer el fichero de carga jasper report "+ex.getMessage());
}
try{
JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "src/reportes/reporte01.pdf");
}catch (JRException e){
JOptionPane.showMessageDialog(null,"Error al cargar fichero jrml jasper report "+e.getMessage());
}
}
Ejecutamos el proyecto ya tenemos nuestro reporte:
Hay problemas con la versión de iReport y Windows. Al ejecutar el proyecto nos puede aparecer dos tipos de errores.
- Error uuid: no está permitido que el atributo uuid aparezca en el elemento jasperreport
- Error cast: can not cast from Integer to String.
Para el error del uuid simplemente en la vista del xml del reporte hay que borrar todos los campos donde venga el uuid. Para el error del cast, hay que añadir en los <textFieldExpressions> la clase correspondiente (String, Integer,Float,...)
Podéis descargaros el proyecto en GitHub -> Reportes GitHub
inputStream = new FileInputStream ("src/reporte/reporte01.jrxml");
ResponderEliminartengo un error en esa linea de codigo me dice que no puede ser convertido a inputStream, tiene alguna solución
Hola!
Eliminar¿El error te da cuando lo ejecutas o es en el código? Si me puedes poner una captura o lo que sea del error exacto te lo agradecería. ¿El proyecto lo has puesto tal cual lo tengo yo? Si lo has puesto en otra ruta puede ser por eso.
Un saludo.
Hola muchas gracias por responder, ya me funciona!, era la tura del archivo.
Eliminarahora cuando lo ejecuto me corre perfecto pero me aparece este mensaje en consola
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
log4j:WARN Please initialize the log4j system properly.
habra algo que pueda hacer, de ante mano muchas gracias por el Vlog me ha servido mucho y me ha salavado la vida ;)
Creo que tiene que ver con algun fichero que te falta de la libreria en el classpath.
EliminarEsta es una imágen de la libreria:
http://es.tinypic.com/view.php?pic=2ymhevb&s=8#.VSOBWuFu6FU
Te puedes descargar las librerias, las tengo subidas aqui:
https://www.dropbox.com/sh/d48489l8i4pvecn/AAAp7pg-6T7h0LHhWiSBZguFa?dl=0
En el anterior tutorial puedes ver como se ponen:
http://sandritascs.blogspot.com.es/2014/10/instalar-jasperreport-e-ireport-en.html
Un saludo.
Muchas gracias por tomarte el tiempo para compartir tus conocimientos, me fue muy útil, en especial la solución al Error uuid.
ResponderEliminarSaludos :)
Muchas gracias a ti ^^
EliminarA mi no me deja Editar el XML
ResponderEliminarTe tiene que dejar editarlo, sino es desde netbeans, te tiene que dejar desde el archivo desde fuera de netbeans. ¿Te sale algún error?
EliminarHola que tal Sandrita a mi tampoco me deja editar el xml :/ se bloquea
EliminarAlgo parecido me sucedia cuando en asp.net no cerraba las etiquetas html pero aqui no he checado si es lo mismo, si alguien encuentra la causa se los agradeceria bastante y muchas felicidades por tu blog es de mucha utilidad :D
EliminarHolaa, pero desde donde no os deja editarlo? Porque se puede editar desde dos sitios. Desde el propio netbeans, o sin abrir netbeans, abriendolo con ireport.
EliminarSe bloquea en el Netbeans y pues lo estoy modificando desde el directorio en el explorador de Windows. Pero ahora me gustaria saber como puedo eliminar todos los uuid encontrados en el Notepad++ al mismo tiempo ? He visto que usan una expresion regular y la usan en el replace del Notepad++ pero no me funcionó. Tal vez no lo he hecho de la forma correcta. Espero me puedas ayudar y muchas gracias por responder Saludos :)
EliminarHola yo los uuid los quito a mano, buscando en notepad y reemplazando (es un poco mierda si pero es como lo hago). No sé por qué no tedeja modificarlo desde netbeans, pero de todas formas yo siempre lo hago desde el directorio.
EliminarUn saludo.
Muy buen tutorial, muchas gracias
ResponderEliminarGracias a ti por comentar ^^
EliminarBuen tutorial, apenas estoy empezando a ocupar esto de iReport y es interesante pero me surgio una duda, al crear mi emptyReport me sale codigo no la parte visual como en tu captura y no se a que se deba agradeceria que me ayudaras con esto porfavor
ResponderEliminarHola, te tiene que salir unos botones como menú parecido a esto:
Eliminarhttp://es.tinypic.com/r/15i4zuc/9
Y tienes que pulsar en vista Diseño.
Disculpa me sale este error al correrlo podrias ayudarme a aclar porque sucede porfavor:
ResponderEliminarnet.sf.jasperreports.engine.xml.JRBandFactory createObject
ADVERTENCIA: The 'isSplitAllowed' attribute is deprecated. Use the 'splitType' attribute instead.
ademas tengo duda de en donde guardo mi reprote de ireport que creo porque no se que poner en esa parte de la ruta para abrirlo y despues pasarlo a pdf como en tu código dice :
inputStream = new FileInputStream ("src/pruebasirve/solicitudServicioSocial.jrxml");
JasperExportManager.exportReportToPdfFile(jasperPrint, "src/pruebasirve/reporteprimero.pdf");
Pues el error te está diciendo que uno de los atributos en el xml es "deprecated" amos que está obsoleto, y que pongas el nuevo que es "splitType"
EliminarEn la parte de la ruta tienes que poner la ruta del directorio donde quieres guardar tu reporte, en tu sistema de ficheros. En el ejemplo puse pues mi ruta. Tienes que poner la que tu quieras.
Un saludo.
Tengo un problema, a la hora de crear el reporte me crea un reporte por cada objeto que agrego a la lista y nose por que, talvez tu puedas ayudarme.
ResponderEliminarHola, quizás porque tienes dentro del bucle el crear el reporte y debería estar fuera. Si pones el trozo de código te podría ayudar mejor.
EliminarUn saludo.
Que gran aporte Sandrita, una pregunta: al momento de cerrar el informe me cierra todo?
ResponderEliminarGracias por el comentario. ¿A qué te refieres con lo de cerrar todo? :P
EliminarHola, agradeceria una respuesta super rapidopor favor :( jaja , para el error uuid tu dices borrar toda la linea donde esta el uuid? , o solo te refieres al campo uuid=""?
ResponderEliminarBuenas, sólo me refiero al campo uuid, no toda la línea.
EliminarUn saludo.
Ayuda!!
ResponderEliminarno se deja eliminar el uuid---
cuando elimino la parte del codigo, al ejecutar el reporte vuelve a aparecer!
Creo recordar si hacías algún cambio desde la vista diseño o si lo volvías a abrir desde netbeans y no desde iReport volvía salir.
EliminarGracias me soluciono lo del error ''uuid'' pero es la única solución? tengo mas de 30 tipos de reportes en mi proyecto y cada reporte tengo que quitarle como 20 atributos ''uuid'' jajaja lo irónico es que el error UUID no me salia con el jasperreports5.6.0 pero me salia un error de jasperprint , cambie a jasperreports3.5.3 me soluciono el error de ''jasperprint'' pero ahi me trajo el del UUID ,empiezo a pensar que es magia negra
ResponderEliminarHola, a mi también me pasó lo mismo. La verdad que es un coñazo jeje es la única forma. No sé por qué a veces pasa eso porque tengo un equipo en el que están las mismas versiones que otro y en uno pasa y otro no :P
EliminarUn saludo.
Muchas gracias, me fue de gran ayuda,al fin pude solucionar el error que me aparecía en el uuid y el de cast en el netbeans
ResponderEliminardisculpa, a mi no me abre la opcion de la vista de arrastrar los elementos, solo aparece la parte de codificacion pero no para arrastrar los elementos, podrias ayudarme?
ResponderEliminarNo sé por qué es eso, a mi no me pasa, pero te tiene que salir esa opción, busca a ver si está en otro lado.
EliminarExcelente!!! me sirvió mucho.
ResponderEliminarBueno tu tutorial pero me pide un log4j el netbeans, que no encuentra el archivo y no puede ejecutar , y solo hice un copia y pega tu ejemplo para probar si funcionaba, agradecería mucho tu ayuda ..
ResponderEliminarAtte : Jc
¿Dónde te lo pide? ¿Qué error te da?
EliminarBuena,tengo un problema con :jasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);
ResponderEliminarentra al catch y se queda como en un bucle infinito
Si entra en el catch te tiene que mostrar la excepción, ¿Cuál es? Y si es un bucle infinito es porque tienes que tener puesto algo que lo haga. Revisalo. Un saludo.
Eliminaralguien que me auxilie
ResponderEliminarago 09, 2017 12:41:35 PM org.apache.commons.digester.Digester error
GRAVE: Parse Error at line 2 column 473: cvc-complex-type.3.2.2: No está permitido que el atributo 'uuid' aparezca en el elemento 'jasperReport'.
org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 473; cvc-complex-type.3.2.2: No está permitido que el atributo 'uuid' aparezca en el elemento 'jasperReport'.
Justamente aqúi te explico que tienes que quitar el parámetro uuid y te digo como hacerlo. Un saludo.
Eliminarme sirvio de mucho muchas gracias sos una proo
ResponderEliminarHola que tal Sandra, hize lo de borrar los uuid pero me sigue saliendo el error...ayudame un favor, gracias.
ResponderEliminarAlguno te tiene que quedar por ahí o algo.
EliminarHola buenas tardes una pregunta. Estoy trabjando en un reporte (jasperReport) en el cual recibira como parametro una imagen que continue una firma, esta imagen la debo de colocar en el reporte. Ya he creado un parametro de tipo (java.lang.Object) y luego lo agregue a mi plantilla, hasta aca aparentemente todo bien. El problema que tengo es que al intentar generar una visualizacion previa (Preview) de Jasper no me pide que ingrese la imagen y por lo tanto lo sale en el reporte. Que estare haciendo mal, o es porque no en el Preview de jasper no se pueden recibir este tipo de objetos (imagen) como parametros? gracias por tu ayuda Sandrita, saludos...
ResponderEliminarBuenas, no lo he probado, así que no puedo decirte con seguridad.
Eliminarhola sandra estoy trabajando con jasper report y vi tu tutorial y lo e implementado pero me sale un error en la siguente linea de codigo
ResponderEliminarjasperPrint = JasperFillManager.fillReport(jasperReport, null, datasource);
error
no suitable method found for fillReport(JasperReport,,AsistentesDataSource)
method JasperFillManager.fillReport(String,Map,Connection) is not applicable
(argument mismatch; JasperReport cannot be converted to String)
method JasperFillManager.fillReport(InputStream,Map,Connection) is not applicable
(argument mismatch; JasperReport cannot be converted to InputStream)
method JasperFillManager.fillReport(JasperReport,Map,Connection) is not applicable
(argument mismatch; AsistentesDataSource cannot be converted to Connection)
method JasperFillManager.fillReport(String,Map,JRDataSource) is not applicable
(argument mismatch; JasperReport cannot be converted to String)
method JasperFillManager.fillReport(InputStream,Map,JRDataSource) is not applicable
(argument mismatch; JasperReport cannot be converted to InputStream)
method JasperFillManager.fillReport(JasperReport,Map,JRDataSource) is not applicab
y no e podido solucionarlo te agradecería tu opinion
No conozco ese error. No sé si será algo con el paso de parámetros.
EliminarLo siento.
hola Sandra, excelente tuto, oye tengo una duda dudosa, vieras que cuando le doy al botón generar reporte de x formulario, el se queda procesando y hasta ahí, no me devuelve errores ni nada... me podrías ayudar?
ResponderEliminarHola Sandra;
ResponderEliminarTe entendí a la perfección, tengo un problemita, al cerrar el reporte me cierra toda la aplicación en la que estoy trabajando, no lo eh solucionado, te agradecería la ayuda <3
Hola, en esta linea
ResponderEliminarjasperPrint = JasperFillManager.fillReport(jasperReport, null,datasource);
no me reconoce el datasource creado mas arriba
solucionado
Eliminarnetbeans 8,2 jdk 8
ResponderEliminarplugins ireport 5.6.0
su codigo sus librerias sus clases descargadas del blog
Eliminarhttps://ibb.co/yqYxbvj
Eliminarimagen del problema
hola el problema que al cerrar el pdf, se me cierra todo el proyecto
ResponderEliminarSystem.exit(0); eso hace
EliminarHola excelente el tutorial, podrias mostrar como cargar los datos a un subreporte, intente hacerlo con los pasos que muestras pero el subreporte solo muestra valores null al mostrar el pdf
ResponderEliminar