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

时间:2018-07-27 19:14:58

标签: jasper-reports subreport jaspersoft-studio

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

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

enter image description here

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

谢谢。


编辑:

感谢引用相似的线程。 提出的大多数问题是关于JasperReports Server用于基于Web的解决方案/程序访问的,而没有解决从另一个项目(在同一Workspace中)嵌入/重用子报表或在表达式编辑器或最佳实践中访问路径变量的问题。

1 个答案:

答案 0 :(得分:2)

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

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

可以通过此表达式(这是简单的Java表达式)来设置工作区的路径。

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

ResourcesPlugin类来自 Eclipse 库-您不需要自己添加其他jar文件。

工作示例

我的项目结构

The workspace structure

我创建了两个项目: Project-A Project-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>

您所需要做的就是从两部分构造子报表的路径:包含指向工作区的绝对路径的参数和具有子报表相对路径( "/Project-A/Reports/Rpt1.jasper" 的常量 String

子报表

子报表来自 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>

输出结果

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

JSS的生成结果:

Generated result with JSS preview

注释

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

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

更多信息可以在这里找到: