【问题标题】:Error Occured in jasperReport FilejasperReport 文件中出现错误
【发布时间】:2013-11-14 10:51:47
【问题描述】:

首先我在 iReport 5.1.0 中创建一个 R_D1.jrxml 文件。

我执行报告的 Java 代码如下所示:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;

public class DbReportFill{

  Connection con;
  public void generateReport() {
    try {
      Class.forName("com.mysql.jdbc.Driver");
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sentiment","root", "abcd");
      System.out.println("Filling report...");
      JasperFillManager.fillReportToFile("/home/abcd/report/R_D1.jrxml",new HashMap<String, Object> (), con);
      System.out.println("Done!");
      con.close();
    } catch (JRException e) {
      e.printStackTrace();
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {
    new DbReportFill().generateReport();
  }

}

当我执行该类时,出现以下异常:

Filling report...
net.sf.jasperreports.engine.JRException: Error loading object from file : /home/abcd/report/R_D1.jrxml  
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:127)  
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:99)   
at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:117) 
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:666)
at DbReportFill.generateReport(DbReportFill.java:24)    
at DbReportFill.main(DbReportFill.java:56)
Caused by: java.io.StreamCorruptedException: invalid stream header: 3C3F786D    
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)   
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299) 
at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.<init>(ContextClassLoaderObjectInputStream.java:58)
at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:122)
... 5 more

我不确定我做错了什么,或者这个异常意味着什么。

【问题讨论】:

  • 我还添加了以下jar:commons-beanutils
  • commons-collection-3.1.jar、commons-digester-2.0.jar、commons-logging-1.1.3.jar、jasperreport-5.1.0.jar
  • 请将此视为建设性的批评,以帮助获得帮助。根据我的经验,阅读您的问题越容易,您获得的帮助就会越快越好。花一些额外的时间来确保您格式化代码块,并且在您的帖子中使用堆栈跟踪是值得的。如需更多帮助,请参阅stackoverflow.com/editing-help

标签: java jasper-reports


【解决方案1】:

您的主要问题是您尚未编译该文件。将 JRXML 文件视为 Java 源文件。要运行您的 java 文件,您必须先编译它,然后才能运行。 jrxml 文件只是描述您想要发生的事情的人类可读 XML 文件。

要编译你做的文件:

JasperCompileManager.compileReport("/home/abcd/report/R_D1.jrxml");

这将返回您和JasperReport 的实例,这是已编译的文件。 (这通常被写入 .jasper 文件,因此您不必在每次运行时编译报告,但这超出了本问题的范围)。一旦你有了这个,你就可以填写报告。

另外,不相关但值得一提的是,您应该在 finally 块中关闭您的数据库连接。与您当前的示例一样,它永远不会关闭,因为抛出了异常。 finally 块将确保即使在发生异常时也会关闭它。

您的示例方法应如下所示:

public void generateReport() {
  Connection con
  try {
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sentiment","root", "abcd");
    System.out.println("Compiling report...");
    JasperReport jasperReport = JasperCompileManager.compileReport("/home/abcd/report/R_D1.jrxml");
    System.out.println("Filling report...");
    JasperFillManager.fillReportToFile(jasperReport,new HashMap<String, Object> (), con);
    System.out.println("Done!");
  } catch (JRException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  } catch (SQLException e) {
    e.printStackTrace();
  } finally {
    if (con != null){
      con.close();
    }
  }
}

希望对您有所帮助。祝你好运。

【讨论】:

  • 谢谢。我应该避免每次使用报告时都编译它吗?
  • 理想情况下,您应该编译一次,而不是每次都使用它。这取决于您的情况如何执行此操作。我从事过应用程序,其中报告与 java 代码一起编译并将 jasper 文件与战争一起打包。但我也研究过将报告存储在数据库中并在首次使用时编译它们并缓存 jasper 文件的应用程序,因此只有在更改时才重新编译它。这取决于您的应用程序。
【解决方案2】:

如果您使用 ireport 工具创建“.jrxml 文件”,那么它将为您提供 .jasper 文件...如果您不想编译,那么您可以像这样在您的 java 程序中使用已经编译的 .jasper 文件:

JasperCompileManager.compileReport("/home/abcd/report/R_D1.jasper");

谢谢, 克里什

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多