在 JasperReports Studio 的不同项目中重用子报表

Reuse subreports across different projects at JasperReports Studio

我正在尝试在我当前的工作区内组织项目结构,以便我可以在多个项目中重用公共资源。

如何将项目中的报表用作不同项目但在同一工作区内的子报表,而不必使用 jrxml 文件的绝对路径?如屏幕截图所示,我计划在 Project-B(使用同一项目中 Images 目录中的资源)中使用报告 Rpt3.jrxml 和 Rpt4.jrxml 作为 Rpt1.jrxml 和Rpt2.jrxml。我尝试使用在项目级别定义的路径变量,但在表达式编辑器中无法识别这些变量。

也有人可以建议在这种情况下什么是最佳实践,我需要在多个项目中重复使用一堆报告作为子报告。

谢谢。


编辑:

感谢您引用相似的线程。 大多数建议的问题都是关于基于 Web solution/programmatic 访问的 JasperReports 服务器,并没有解决 embedding/reusing 来自另一个项目(在同一工作区内)的子报告或访问表达式编辑器中的路径变量或最佳实践的问题.

可能的解决方案是使用报告的参数

您可以创建用于存储工作区路径的新参数,然后在报告中使用此参数。

工作区的路径可以在这个表达式的帮助下设置(这是一个简单的 Java 表达式)。

<defaultValueExpression><![CDATA[org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()]]></defaultValueExpression>

ResourcesPlugin class 来自 Eclipse 库 - 您不需要自己添加额外的 jar 文件。

工作示例

我的项目结构

我创建了两个项目:Project-AProject-B。两个项目都包含用于存储模板的文件夹 Reports

主报告

主要报告来自Project-B

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Rpt2" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="curDir" class="java.lang.String">
        <defaultValueExpression><![CDATA[org.eclipse.core.resources.ResourcesPlugin.getWorkspace().getRoot().getLocation().toString()]]></defaultValueExpression>
    </parameter>
    <title>
        <band height="70" splitType="Stretch">
            <subreport>
                <reportElement x="0" y="40" width="560" height="30"/>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <subreportExpression><![CDATA[$P{curDir} + "/Project-A/Reports/Rpt1.jasper"]]></subreportExpression>
            </subreport>
            <staticText>
                <reportElement x="0" y="0" width="550" height="35"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <text><![CDATA[Report 2]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

您只需要从两部分构造子报表的路径:包含工作区绝对路径的参数和常量 String 以及子报表的相对路径 ("/Project-A/Reports/Rpt1.jasper").

子报表

子报表来自Project-A

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Rpt1" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <title>
        <band height="79" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="22" width="560" height="35"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <text><![CDATA[Report 1]]></text>
            </staticText>
        </band>
    </title>
</jasperReport>

输出结果

我使用了一个空记录数据适配器(new JREmptyDataSource(1) ) 用于构建主报告。

JSS 生成的结果:

备注

设计模板后,您可以使用多个选项来显示子报表:

  • 使用参数以与上述相同的方式传递部分路径
  • 使用 FileRepositoryService class。可以使用相对路径
  • 使用 SimpleJasperReportsContext class。可以使用相对路径
  • 使用 JRParameter.REPORT_CLASS_LOADER 参数传递 classloader。可以使用 classloader
  • 加载的资源

可以在此处找到更多信息:

  • What replaces FileResolver in the JasperReports API?