Ayuda con Jasperreports

alonso
10 de Mayo del 2008
Saludos a todos: tengo un problema que paso a explicar :
He estado tratando de cargar varios ejemplos de JasperReports tanto en el NetBeans
como en el JCreator y siempre encuentro excepciones. Estoy trabajando con el NetBeans
desde hace casi un año y sólo he podido hacer reportes utilizando formato HTML el cual
visualizo en un JTextPane, pero no son muy presentables que digamos. He estado leyendo
mucha informacion acerca de JasperReport y del iReport, éste último es una buena herramienta
para usar el Jasperreports pero siempre encuentro problemas al tratar de hacer aunque sea un
programa de ejemplo para ver como funciona. Hasta ahora solo he conseguido excepciones como :
java.io.FileNotFoundException: miarchivo.xml (El sistema no puede hallar el archivo especificado)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at dori.jasper.engine.xml.JRXmlLoader.load(JRXmlLoader.java:338) ...............etc.
//-------- otra excepcion es :
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
at java.lang.ClassLoader.defineClass0(Native Method)
..................... etc.
He encontrado solo un par de páginas en la web en donde se muestra un poco de codigo
pero son un tanto escuetos o se obvian algunos detalles sobre todo cuando uno es nuevo en java o jasperreports.
En el caso especial de netBeans debo colgar el archivo jar de jasperreports o mi archivo xml en
algun directorio en especial ?? he tratado de muchas formas y no he logrado nada. Con el iReport
no existe ningun problema ya que puedo crear los xml y compilarlos y ejecutarlos con el mysql e incluso
imprimirlos en todos sus formatos, pero como puedo hacer todo eso desde mi aplicacion.??
Agradeceria si alguien pudiera darme alguna orientacion en este asunto ???
(llevo 5 dias pegado a la silla y casi al borde de la desesperacion)



ChinoKao
10 de Mayo del 2008
Yo uso el jFreeReports y la verdad es que he tenido problemas parecidos, que se solucionaban importando correctamente las librerías (cuando ejecuto con NetBeans) y creando un jar manualmente con todos los .class de las librerías del jFreeReport y mis archivos, para ejecutarlo en otras máquinas.

A mi me funciona bien, si usas jCreator mira a ver si en el proyecto has importado correctamente las librerías del JasperReports.

Bueno un saludo

maramonar
10 de Mayo del 2008
Nosotros lo estamos utilizando en nuestra aplicación, pero no mostramos el resultado directamente, le enviamos un correo al usuario que solicitó el reporte con una url al archivo generado. Para generar el reporte usamos una función mas o menos así:
public void fillReport(String reportName, Map reportParams, int exportFormat, String resultFileName, Map extraParams) throws ServicesException {
Connection conn = null;
try {
DataSource ds = (DataSource)ObjectLocator.getInstance().lookup(JNDINames.DEFAULT_APP_DATASOURCE);
conn = ds.getConnection();

JasperPrint jasperPrint = null;
if (exportFormat != ReportPrintingTask.TO_CSV)
{
// Agrego un parámetro a los definidos por el usuario con el path para encontrar los fuentes de los subreportes
String reportFilePath = reportName.substring(0, reportName.lastIndexOf("/") + 1);
reportParams.put("SUB_REPORT_PATH", reportFilePath);
jasperPrint = JasperFillManager.fillReport(reportName, reportParams, conn);
}

if (exportFormat == ReportPrintingTask.TO_XLS) {
JRXlsExporter xlsExporter = new JRXlsExporter();
xlsExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
xlsExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, resultFileName);
xlsExporter.setParameter(JRXlsExporterParameter.IS_ONE_PAGE_PER_SHEET, Boolean.FALSE);
xlsExporter.setParameter(JRXlsExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
xlsExporter.exportReport();
} else if (exportFormat == ReportPrintingTask.TO_HTML) {
JRHtmlExporter htmlExporter = new JRHtmlExporter();
htmlExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
htmlExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, resultFileName);
htmlExporter.setParameter(JRHtmlExporterParameter.IS_OUTPUT_IMAGES_TO_DIR, Boolean.FALSE);
htmlExporter.setParameter(JRHtmlExporterParameter.IS_REMOVE_EMPTY_SPACE_BETWEEN_ROWS, Boolean.TRUE);
htmlExporter.exportReport();
} else if (exportFormat == ReportPrintingTask.TO_PDF) {
JRPdfExporter pdfExporter = new JRPdfExporter();
pdfExporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
pdfExporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, resultFileName);
pdfExporter.exportReport();
} else if (exportFormat == ReportPrintingTask.TO_CSV) {
String spName = (String) extraParams.get("spName");
exportToCSV(reportParams,resultFileName,spName);
}

} catch (Exception e) {
throw new ServicesException("JasperReportGenerator.fillReport()", e);
} finally {
if (conn != null) {
try {conn.close();} catch (Exception e) {}
}
}
}
Probablemente el código quede bastante confuso, pero las partes importantes serían:
jasperPrint = JasperFillManager.fillReport(reportName, reportParams, conn);
le pedis a Jasper que genere un reporte en su formato "nativo" y luego con este y el formato de reporte que haya elegido el usuario usas el Exporte que corresponda. De nuestra experiencia el único formato que sale "como la gente" es el pdf, los demás son una porquería.
Con respecto a las excepciones que comentas que te aparecen, la primera parecería que se produce porque no encuentra el fuente del reporte. Cuando haces fillReport(reportName, reportParams, conn)
reportName tiene que tener el camino completo para poder llegar al xml del reporte.
La otra excepción paracería indicar que te falta el commons-digester-1.3 en el classpath...fijate que necesitas una bocha de librerías en el classpath para que funcione. En fin....paciencia....

alonso
10 de Mayo del 2008
Hola maramonar:
antes que nada te agradesco que hayas contestado a mi duda. Te comento que he seguido algunos consejos: he copiado todas las librerias que vienen con el zip del jasperreports project en mi JDK y tambien he dado la ruta completa a mi archivo xml.
he tomado uno de los demos al cual por comodidad he borrado algunos comentarios es el siguiente:
//--------------------------------------------------------------------------------------------------------------------------------------------
import dori.jasper.engine.*;
import dori.jasper.engine.export.*;
import dori.jasper.engine.util.*;
import dori.jasper.view.*;
import java.awt.Color;
import java.util.*;
import java.io.*;

public class AlterDesignApp
{
private static final String TASK_COMPILE = "compile";
private static final String TASK_FILL = "fill";
private static final String TASK_PRINT = "print";
private static final String TASK_PDF = "pdf";

public static void main(String[] args)
{
String fileName = null;
String taskName = null;

if(args.length == 0)
{
usage();
return;
}

int k = 0;
while ( args.length > k )
{
if ( args[k].startsWith("-T") )
taskName = args[k].substring(2);
if ( args[k].startsWith("-F") )
fileName = args[k].substring(2);

k++;
}

try
{
long start = System.currentTimeMillis();
if (TASK_COMPILE.equals(taskName))
{
JasperCompileManager.compileReportToFile(fileName);
System.err.println("Compile time : " + (System.currentTimeMillis() - start));
System.exit(0);
}
else if (TASK_FILL.equals(taskName))
{
File sourceFile = new File(fileName);
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(sourceFile);

JRRectangle rectangle = (JRRectangle)jasperReport.getTitle().getElementByKey("first.rectangle");
rectangle.setForecolor(new Color((int)(16000000 * Math.random())));
rectangle.setBackcolor(new Color((int)(16000000 * Math.random())));

rectangle = (JRRectangle)jasperReport.getTitle().getElementByKey("second.rectangle");
rectangle.setForecolor(new Color((int)(16000000 * Math.random())));
rectangle.setBackcolor(new Color((int)(16000000 * Math.random())));

rectangle = (JRRectangle)jasperReport.getTitle().getElementByKey("third.rectangle");
rectangle.setForecolor(new Color((int)(16000000 * Math.random())));
rectangle.setBackcolor(new Color((int)(16000000 * Math.random())));

JRReportFont reportFont = jasperReport.getFonts()[0];
reportFont.setSize(16);
reportFont.setItalic(true);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, (JRDataSource)null);

File destFile = new File(sourceFile.getParent(), jasperReport.getName() + ".jrprint");
JRSaver.saveObject(jasperPrint, destFile);

System.err.println("Filling time : " + (System.currentTimeMillis() - start));
System.exit(0);
}
else if (TASK_PRINT.equals(taskName))
{
JasperPrintManager.printReport(fileName, true);
System.err.println("Printing time : " + (System.currentTimeMillis() - start));
System.exit(0);
}
else if (TASK_PDF.equals(taskName))
{
JasperExportManager.exportReportToPdfFile(fileName);
System.err.println("PDF creation time : " + (System.currentTimeMillis() - start));
System.exit(0);
}
else
{
usage();
System.exit(0);
}
}
catch (JRException e)
{
e.printStackTrace();
System.exit(1);
}
catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}
}

private static void usage()
{
System.out.println( "AlterDesignApp usage:" );
System.out.println( "tjava AlterDesignApp -Ttask -Ffile" );
System.out.println( "tTasks : compile | fill | print | pdf" );

//Para compilar el reporte escrbir en set arguments: (en mi caso desde el NetBeans)
// -Tcompile -Fd:pruebajasperejemplo1AlterDesignReport.xml
//Para llenar el reporte escrbir en set arguments:
// -Tfill -Fd:pruebajasperejemplo1AlterDesignReport.jasper
//Para crear el pdf escrbir en set arguments:
// -Tpdf -Fd:pruebajasperejemplo1AlterDesignReport.jrprint
//Para imprimir el pdf escrbir en set arguments:
// -Tprint -Fd:proyectos-javajasper-repejemplo1AlterDesignReport.jrprint
//claro está que las rutas de los archivos son relativas a mi ejemplo
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------


He tratado de hacerlo funcionar. Lo que si he logrado es hacer las tareas fill, print y pdf, excepto la tarea "compile" en la cual me sale la siguiente excepcion:
//--------------------------------------------------------------------------------------------------------------------------------------------
java.io.IOException: CreateProcess: javac -classpath "C:WINDOWS.netbeans3.5system;C:ARCHIVOS DE PROGRAMANETBEANS IDE 3.5.1system;C:Archivos de programaNetBeans IDE 3.5.1modulesextAbsoluteLayout.jar;C:Archivos de programaNetBeans IDE 3.5.1modulesautoloadextservlet-2.3.jar;C:Archivos de programaNetBeans IDE 3.5.1libextxml-apis-1.0b2.jar;C:Archivos de programaNetBeans IDE 3.5.1beansTimerBean.jar;C:almacen;D:proyectos-javajasper-repejemplo1;D:proyectos-javajasper-repjasperreports-0.5.2.jar;" "C:Archivos de programaNetBeans IDE 3.5.1AlterDesignReport.java" error=0
at java.lang.Win32Process.create(Native Method)
at java.lang.Win32Process.<init>(Win32Process.java:66)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:566)
at java.lang.Runtime.exec(Runtime.java:491)
at java.lang.Runtime.exec(Runtime.java:457)
at dori.jasper.engine.design.JRJavacCompiler.compileClass(JRJavacCompiler.java:102)
at dori.jasper.engine.design.JRAbstractJavaCompiler.compileReport(JRAbstractJavaCompiler.java:151)
at dori.jasper.engine.design.JRDefaultCompiler.compileReport(JRDefaultCompiler.java:136)
at dori.jasper.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:135)
at dori.jasper.engine.JasperCompileManager.compileReportToFile(JasperCompileManager.java:107)
at AlterDesignApp.main(AlterDesignApp.java:43)
//--------------------------------------------------------------------------------------------------------------------------------------------

es decir que puedo crear el archivo *.pdf, *.jrprint, pero no puedo crear el *.jasper a partir de xml.
Es un alivio haber salido del trance de no poder hacer nada gracias a vuestros consejos y espero que puedas tener algun tiempito de poder responderme. este ejemplo es sencillo; sólo pinta tres bandas con colores aleatorios pero es lo primero que debo poder hacer antes de meterme en los reportes con las b.d. y con mysql. Pero lo principal es que no puedo generar el *.jasper a partir del *.xml.
Gracias por la ayuda.
Alonso.

Gemm
10 de Mayo del 2008
Hola,
Tengo el formato de un reporte en Ireport y necesito correrlo con tomcat.

Por Favor si me puedes ayudar, no se que librerias utilizar y donde.....

Gracias de antemano

jbarrau
10 de Mayo del 2008
yo tengo un drama parecido al tuyo.
Trabajo con eclipse, jasper reports e ireports.
El cliente trabaja con el programa correctamente desde el entorno del eclipse, pero al intentar usar la aplicación fuera me fallan los listados.
Como chapucilla he copiado todas las clases habidas y por haber (las que aparecen en el listado de jars del proyecto de eclipse) al directorio lib del java, pero el problema persiste. El error exacto es:
java.lang.NoClassDefFoundError: dori/jasper/engine/JasperFillManager
at auditori.actionPerformed(auditori.java:1382)

todo el código del programa está en el directorio lib, el classpath apunta justo ahí y estoy bastante desesperado.
La verdad es que la falta de documentación del Jasperreports desespera un poco, pero, en fin.

algunos truquillos que hay que saber y sin los que te vuelves loco son:
- copiar tools.jar en el directorio lib, porque esta librería incluye el compilador que usa jasper para generar los listados

- modificar el código de jasperviewer para que tu aplicación no se cierre cada vez que previsualizas el listado y volver a crear jasperreports-0.5.0-applet.jar; es un tostón, pero puedes aprovechar para traducir al español el previsualizador.

Si quereis compartir cualquier tipo de información con respecto al jasper aquí estamos, y si alguien me puede ayudar con mi problemilla...

Engels
10 de Mayo del 2008
Buenas Tardes.
Se que tu comentario es un poco atrasado, pero me gustaria que me pudieras enviar la manera de hacer correr el ireport con jsp. De antemano te agradezco

Fernando Ayala
10 de Mayo del 2008
Saludos, mira lo q creo q t esta ocurriendo es q te faltan algunas de las librerias para poder ejecutar el reportey es x eso q t sale esta excepcion:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/digester/Digester
at java.lang.ClassLoader.defineClass0(Native Method)

Si t interesa recibir ayuda al respecto escribeme a: [email protected] y co gusto t enviare una muy util ayuda con ejemplos. . .

yo ni
10 de Mayo del 2008
estudia y no seas vago o que acaso quieres que te de el codigo ah y nos vemos y o seas vago y investiga has algo siquiera