2013-11-14 16 views
7

Đầu tiên tôi tạo một tệp R_D1.jrxml trong iReport 5.1.0.Lỗi xảy ra trong tệp jasperReport

đang

My Java để thực hiện báo cáo trông giống như:

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

} 

Khi tôi thực hiện lớp tôi nhận được ngoại lệ sau đây:

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 

Tôi không chắc chắn những gì tôi đang làm sai, hoặc ngoại lệ này có nghĩa là gì.

+0

tôi cũng đã thêm sau jar: commons-beanutils – user2865749

+0

commons-thu-3.1.jar, commons-nồi-2.0.jar, commons-logging-1.1.3. jar, jasperreport-5.1.0.jar – user2865749

+0

Hãy coi đây là lời chỉ trích mang tính xây dựng, để được giúp đỡ. Theo kinh nghiệm của tôi thì càng dễ dàng để đọc câu hỏi của bạn, thì càng nhanh càng giúp bạn nhận được càng nhiều. Mất thêm vài phút để đảm bảo bạn định dạng các khối mã và ngăn xếp dấu vết trong bài đăng của bạn đáng giá. Xem http://stackoverflow.com/editing-help để được trợ giúp thêm. –

Trả lời

10

Vấn đề chính của bạn ở đây là bạn chưa biên soạn tệp. Hãy nghĩ về tệp JRXML dưới dạng tệp nguồn Java. Để chạy tệp java của bạn, bạn phải biên dịch nó trước, và sau đó bạn có thể chạy. Tệp jrxml chỉ đơn giản là tệp XML có thể đọc được của con người mô tả những gì bạn muốn xảy ra.

Để biên dịch các tập tin bạn cần làm:

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

Điều này sẽ trả lại cho bạn và thể hiện của một JasperReport, đó là tập tin biên soạn. (điều này thường được viết ra thành tệp .jasper, do đó bạn không phải biên dịch báo cáo trên mỗi lần chạy, nhưng điều đó nằm ngoài phạm vi của câu hỏi này). Một khi bạn có điều này, bạn có thể điền vào báo cáo.

Ngoài ra, không liên quan, nhưng đáng nhắc đến, là bạn nên đóng kết nối cơ sở dữ liệu của bạn trong một khối cuối cùng. Như trong ví dụ hiện tại của bạn nó không bao giờ bị đóng, vì một ngoại lệ được ném ra. Một khối cuối cùng sẽ đảm bảo rằng ngay cả trong trường hợp ngoại lệ, nó sẽ bị đóng.

Bạn phương pháp mẫu nên hình như:

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

Hy vọng rằng sẽ giúp. Chúc may mắn.

+0

Cảm ơn. Tôi có nên tránh lập báo cáo mỗi khi tôi sử dụng nó không? – Flamma

+1

Lý tưởng nhất là bạn sẽ biên dịch một lần và không phải lúc nào bạn cũng sử dụng nó. Nó phụ thuộc vào tình hình của bạn về cách bạn làm điều này. Tôi đã làm việc trên các ứng dụng, nơi các báo cáo được biên dịch cùng với mã java và đóng gói các tệp jasper trong cuộc chiến. Nhưng tôi cũng đã làm việc trên các ứng dụng lưu trữ các báo cáo trong một cơ sở dữ liệu và biên dịch chúng vào lần sử dụng đầu tiên, và lưu trữ tệp jasper, vì vậy nó chỉ được biên dịch lại khi nó thay đổi. Nó phụ thuộc vào ứng dụng của bạn. –

2

Nếu bạn đang tạo "tệp .jrxml" bằng cách sử dụng công cụ ireport thì tệp này sẽ cung cấp cho bạn tệp .jasper ... Nếu bạn không muốn biên dịch thì bạn có thể sử dụng tệp .jasper đã được biên dịch trong chương trình java của mình này:

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

Cảm ơn, Krish

Các vấn đề liên quan