在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");
谢谢,克里什
- 为什么我会得到exceptionjava.lang.NoClassDefFoundError org / codehaus / groovy /?
- 如何使用PHP中的参数实例化/调用java类?
- 使用JasperReports库和MongoDB生成PDF
- 如何从Web应用程序打印到收据打印机?
- JasperReports中的java.util.ConcurrentModificationException
- 如何创建单个表达式,显示两个日期之间的时差,如年,月,日,小时,分钟,秒
- 连接主报表和子报表 – 将对象列表传递到子报表
- 可以将java文本字段中的数据发送到jasper报告而无需数据库交互吗?
- 如何在Ireport 4.5中更改日期格式