如何在ireport中执行主报表时编译子报表?

时间:2010-08-03 12:38:13

标签: java netbeans jasper-reports ireport

我正在尝试从java中动态编译子报告。 我将子报表表达式放在MAIN报表中,如下所示。

<subreportExpression class="net.sf.jasperreports.engine.JasperReport"><![CDATA[SubReportCompiler.getCompiledReport("reportId")]]></subreportExpression>

我的子报告编译器代码如下:

public class SubReportCompiler {

private static final String JR_XML_HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    + "<!DOCTYPE jasperReport PUBLIC \"-//JasperReports//DTD Report Design//EN\" \"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd\">";


public static JasperReport getCompiledReport(String reportId)
{

    Report report = Report.getReportObject(reportId, applicationId);

    String jasperXML=JR_XML_HEADER + report.getJASPERXML();
    InputStream jrXMLStream = new ByteArrayInputStream(jasperXML.getBytes());
    JasperReport jReport;

    try {
        jReport = JasperCompileManager.compileReport(jrXMLStream);
    } catch (JRException e) {
        throw new ReportException(e.getMessage(), e);
    }
    catch (Exception e)
    {
        throw new ReportException(e.getMessage(), e);
    }

    return jReport;
}

}

当我尝试从java执行主报告时。我收到以下错误。

(java.lang.String)没有这样的属性:类的SubReportCompiler:report2_1280833699753_269232

我是否需要注册任何属性?如何在执行主报表的同时从java中动态编译子报表?

1 个答案:

答案 0 :(得分:1)

放置SubReportCompiler类的位置?它是放在应用程序Java包中的某个位置吗?如果是,则应在JRXML中指定完全限定的类名:

<subreportExpression class="net.sf.jasperreports.engine.JasperReport">
<![CDATA[mypackage.SubReportCompiler
.getCompiledReport("reportId")]]></subreportExpression>

将上面代码中的“mypackage”替换为您的包名。