10

まず、iReport 5.1.0 で R_D1.jrxml ファイルを 1 つ作成します。

レポートを実行する 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

何が間違っているのか、この例外が何を意味するのかわかりません。

4

2 に答える 2

15

ここでの主な問題は、ファイルをコンパイルしていないことです。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();
    }
  }
}

それが役立つことを願っています。幸運を。

于 2013-11-14T16:15:47.793 に答える