オクラホマので、それは牛車のビットを必要ですが、私は何かを把握することができました...
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;
}
私もその答えをお聞きしたいと思います。私は* .jasperファイルへのリンクを直ちにサブレポートの代わりに直接コンパイルしました。 :( –
ディスク上にファイルを保存せずに同様の問題が解決されました:http://stackoverflow.com/questions/9785451/generate-jasper-report-with-subreport-from-java –