在 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-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>
您只需要从两部分构造子报表的路径:包含工作区绝对路径的参数和常量 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?
我正在尝试在我当前的工作区内组织项目结构,以便我可以在多个项目中重用公共资源。
如何将项目中的报表用作不同项目但在同一工作区内的子报表,而不必使用 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-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>
您只需要从两部分构造子报表的路径:包含工作区绝对路径的参数和常量 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?