2012-04-04 30 views
8

私はスタンドアロンアプリケーションを持っています。その任務の1つは、* .jrxmlファイルのパスを取得してコンパイルすることです。Jasper Reports:サブレポートをコンパイルする方法

サブレポートがあるレポートが表示され、マスターのコンパイルでその子がコンパイルされず、サブレポート* .jasperファイルがトラックの後ろに見つからない場合は、これを問題なく実行できます。

自動的にサブレポートをピックアップするJasperCompileManager設定し

1)の方法はありますか?

2)JasperDesignオブジェクトまたはJasperReportオブジェクトのいずれかに含まれるサブレポートへのパスのリストを取得しますか?

私はjrxmlファイルに直接アクセスできません。したがって、コンパイル方法に合わせてレポートを変更することはできません。また、どのサブレポートがどのレポートに属するかを推測するための標準命名体系も適用されません。

ここで同様の問題があります:

JRVisitorがJRSubreportオブジェクトのリストを生成するために使用されるhttp://jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=40683

、しかしサブレポートへのパスを取得するためにこれを使用する方法の何の説明がありませんがそれをコンパイルし、サブレポートのサブレポートを再帰的に探すために、私はそれを把握できません。

+0

私もその答えをお聞きしたいと思います。私は* .jasperファイルへのリンクを直ちにサブレポートの代わりに直接コンパイルしました。 :( –

+0

ディスク上にファイルを保存せずに同様の問題が解決されました:http://stackoverflow.com/questions/9785451/generate-jasper-report-with-subreport-from-java –

答えて

8

オクラホマので、それは牛車のビットを必要ですが、私は何かを把握することができました...

subreport.getExpression()。getTextには、()内のサブレポートウィジェット事の式フィールドを返します。マスターレポートであり、このような文字列です

したがって、次のように名前を取得するために別の名前を取得できました。それは理想的ではありませんが、それは守るべきです。

JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){ 

    // ** snip other overrides ** 

    @Override 
    public void visitSubreport(JRSubreport subreport){ 
    String expression = subreport.getExpression().getText().replace(".jasper", ".jrxml"); 
    StringTokenizer st = new StringTokenizer(expression, "\"/"); 
    String subreportName = null; 
    while(st.hasMoreTokens()) 
     subreportName = st.nextToken(); 
    compileReport(subreportName); 
    } 
} 

EDIT:

ここでは、再帰的に完璧な、しかし、私のアプリのために十分ではないサブレポートのサブレポートなどをコンパイルする方法を実証し、私の全体のcompileReport方法です。すべてのコンパイルされた* .jasperファイルは、コンパイルされていない* .jrxmlファイルが選択されたのと同じ場所にディスクに保存されますが、変更するのは難しくありません。コンパイルされたメインレポートオブジェクトは、それを実行したいときなどに渡されます。

このコードはこの編集時に9ヶ月間保存されていることを覚えておいてください。新しいバージョンのJasper Reportsには、このような機能のためのinbuild機能が追加されました。

private static final String reportsPath = "someplace/nice/"; 
private ArrayList<String> completedSubReports = new ArrayList<String>(30); 
private Throwable   subReportException = null; 

/** 
* Recursively compile report and subreports 
*/ 
public JasperReport compileReport(String reportName) throws Throwable{ 
    JasperDesign jasperDesign = JRXmlLoader.load(reportsPath + reportName + ".jrxml"); 
    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
    JRSaver.saveObject(jasperReport, reportsPath + reportName + ".jasper"); 
    toLog("Saving compiled report to: " + reportsPath + reportName + ".jasper"); 
    //Compile sub reports 
    JRElementsVisitor.visitReport(jasperReport, new JRVisitor(){ 
    @Override 
    public void visitBreak(JRBreak breakElement){} 

    @Override 
    public void visitChart(JRChart chart){} 

    @Override 
    public void visitCrosstab(JRCrosstab crosstab){} 

    @Override 
    public void visitElementGroup(JRElementGroup elementGroup){} 

    @Override 
    public void visitEllipse(JREllipse ellipse){} 

    @Override 
    public void visitFrame(JRFrame frame){} 

    @Override 
    public void visitImage(JRImage image){} 

    @Override 
    public void visitLine(JRLine line){} 

    @Override 
    public void visitRectangle(JRRectangle rectangle){} 

    @Override 
    public void visitStaticText(JRStaticText staticText){} 

    @Override 
    public void visitSubreport(JRSubreport subreport){ 
     try{ 
     String expression = subreport.getExpression().getText().replace(".jasper", ""); 
     StringTokenizer st = new StringTokenizer(expression, "\"/"); 
     String subReportName = null; 
     while(st.hasMoreTokens()) 
      subReportName = st.nextToken(); 
     //Sometimes the same subreport can be used multiple times, but 
     //there is no need to compile multiple times 
     if(completedSubReports.contains(subReportName)) return; 
     completedSubReports.add(subReportName); 
     compileReport(subReportName); 
     } 
     catch(Throwable e){ 
     subReportException = e; 
     } 
    } 
    @Override 
    public void visitTextField(JRTextField textField){} 

    @Override 
    public void visitComponentElement(JRComponentElement componentElement){} 

    @Override 
    public void visitGenericElement(JRGenericElement element){} 
    }); 
    if(subReportException != null) throw new RuntimeException(subReportException); 
    return jasperReport; 
} 
+0

'compileReport()'は何をしますか?サブレポートのコンパイルは保存されていますか?ディスクには? – dzieciou

+0

@dzieciou上記の編集済みの回答を参照してください。 – Numeron

+0

私はそれが約2歳であることを知っています。 –

関連する問題