在 java 中在运行时编译 jasperreport 子报表

Compile jasperreport subreports at runtime in java

我有一个 java 休息服务,returns 从 jasper 文件生成 PDF。对于某些业务规则,编译后的 .jasper 文件不会在服务上,只有 .jxrml 文件。我使用这一行

在运行时编译报告
JasperReport report = JasperCompileManager.compileReport(fileName);

这是子报表的原始部分,其中引用了已编译的 .jasper 文件

        <subreport isUsingCache="false">
            <reportElement x="57" y="30" width="498" height="15" isRemoveLineWhenBlank="true" uuid="5b26c250-7d4d-4ddb-9fdc-834a98fc6eac"/>
            <subreportParameter name="fecha">
                <subreportParameterExpression><![CDATA[$F{recorridodato_Fecha}]]></subreportParameterExpression>
            </subreportParameter>
            <subreportParameter name="idRuta">
                <subreportParameterExpression><![CDATA[$F{ruta_RutaId}.longValue()]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "subreport.jasper"]]></subreportExpression>
        </subreport>

这是我在某处(我不记得在哪里)读到的我应该做的

        <subreport isUsingCache="false">
            <reportElement x="57" y="30" width="498" height="15" isRemoveLineWhenBlank="true" uuid="5b26c250-7d4d-4ddb-9fdc-834a98fc6eac"/>
            <subreportParameter name="fecha">
                <subreportParameterExpression><![CDATA[$F{recorridodato_Fecha}]]></subreportParameterExpression>
            </subreportParameter>
            <subreportParameter name="idRuta">
                <subreportParameterExpression><![CDATA[$F{ruta_RutaId}.longValue()]]></subreportParameterExpression>
            </subreportParameter>
            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
            <subreportExpression><![CDATA[JasperCompileManager.compileReport(getClass().getResource($P{SUBREPORT_DIR} + "subreport.jrxml").openStream())]]></subreportExpression>
        </subreport>

当从 iReport 中调用报表时,第二个选项有效。但是,从服务调用时失败。生成的 PDF 不打印子报表数据。第一个选项在 iReport 和 REST 服务调用上都工作正常,但它引用编译的 .jasper 文件,该文件将不可访问。所以我需要通过仅引用 .jrxml 子报告路径(而不是 .jasper 文件)在 Java 中生成全局报告 我正在使用这些 Maven 引用

                <!-- Jasper-->
    <dependency>
        <groupId>net.sf.jasperreports</groupId>
        <artifactId>jasperreports</artifactId>
        <version>5.6.0</version>
    </dependency>
    <dependency>
        <groupId>net.sourceforge.jexcelapi</groupId>
        <artifactId>jxl</artifactId>
        <version>2.6.12</version>
    </dependency>

多亏了这个post

我找到了一个方法

Jasper Reports: How to compile subreports

基本上它涉及读取 jrxml 文件以检测子报表并将它们编译到 .jasper 应该所在的物理路径。