Java jasperReport文件中出现错误

Java jasperReport文件中出现错误,java,jasper-reports,Java,Jasper Reports,首先,我在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.engi

首先,我在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();
  }

}
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.util.HashMap;
导入net.sf.jasperreports.engine.JRException;
导入net.sf.jasperreports.engine.JasperFillManager;
公共类DbReportFill{
连接con;
公共无效生成器报告(){
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/sentiment“、”根“、”abcd”);
System.out.println(“填充报告…”);
JasperFillManager.fillReportToFile(“/home/abcd/report/R_D1.jrxml”,新HashMap(),con);
System.out.println(“完成!”);
con.close();
}捕获(JRE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(SQLE异常){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
新建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
正在填充报告。。。
net.sf.jasperreports.engine.JRException:从文件加载对象时出错:/home/abcd/report/R_D1.jrxml
位于net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:127)
位于net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:99)
位于net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:117)
位于net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:666)
在DbReportFill.generateReport(DbReportFill.java:24)
位于DbReportFill.main(DbReportFill.java:56)
原因:java.io.StreamCorruptedException:无效的流头:3C3F786D
位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
位于java.io.ObjectInputStream。(ObjectInputStream.java:299)
位于net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream。(ContextClassLoaderObjectInputStream.java:58)
位于net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:122)
... 还有5个

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

您这里的主要问题是您没有编译该文件。将JRXML文件视为Java源文件。要运行java文件,必须先编译它,然后才能运行。jrxml文件只是一个人类可读的XML文件,它描述了您希望发生的事情

要编译文件,请执行以下操作:

JasperCompileManager.compileReport("/home/abcd/report/R_D1.jrxml");
这将返回您和的实例,即编译文件。(这通常写入.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();
    }
  }
}
public void generateReport(){
连接con
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
con=DriverManager.getConnection(“jdbc:mysql://localhost:3306/sentiment“、”根“、”abcd”);
System.out.println(“编译报告…”);
JasperReport-JasperReport=JasperCompileManager.compileReport(“/home/abcd/report/R_D1.jrxml”);
System.out.println(“填充报告…”);
fillreportofile(jasperReport,newhashmap(),con);
System.out.println(“完成!”);
}捕获(JRE异常){
e、 printStackTrace();
}catch(classnotfounde异常){
e、 printStackTrace();
}捕获(SQLE异常){
e、 printStackTrace();
}最后{
如果(con!=null){
con.close();
}
}
}
希望有帮助。祝你好运。

如果你正在使用ireport工具创建“.jrxml文件”,它将为你提供.jasper文件…如果你不想编译,你可以在java程序中使用已经编译的.jasper文件,如下所示:

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

我还添加了以下jar:commons-beanutilscommons-collection-3.1.jar、commons-digester-2.0.jar、commons-logging-1.1.3.jar、jasperreport-5.1.0.jar请将此视为建设性的批评,以帮助获得帮助。根据我的经验,阅读你的问题越容易,你得到的帮助就会越快越好。多花几分钟来确保格式化代码块,并在文章中添加堆栈跟踪是值得的。请参阅以获取更多帮助。谢谢。我应该避免每次使用报告时都编译它吗?理想情况下,您应该编译一次,而不是每次使用它。这取决于你的情况,取决于你如何做到这一点。我曾在应用程序上工作过,其中的报告与java代码一起编译,并将jasper文件打包到war中。但我也曾在一些应用程序上工作过,这些应用程序将报告存储在数据库中,并在第一次使用时对其进行编译,并缓存jasper文件,因此只有当它发生更改时才重新编译。这取决于你的申请。