在jasperReport文件中出现错误

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

当我执行该类时,我得到以下exception:

 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.(ObjectInputStream.java:299) at net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream.(ContextClassLoaderObjectInputStream.java:58) at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:122) ... 5 more 

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

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

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

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

这将返回您和JasperReport实例,它是已编译的文件。 (这通常写在.jasper文件中,因此您不必在每次运行时编译报告,但这超出了本问题的范围)。 完成后,您可以填写报告。

此外,不相关但值得一提的是,您应该在finally块中关闭数据库连接。 在您当前的示例中,它永远不会关闭,因为抛出exception。 finally块将确保即使在exception情况下它也将被关闭。

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

 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 (), 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(); } } } 

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

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

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

谢谢,克里什