[英]How to pass parameters and resource bundle from master report to subreport
目前我正在使用JasperReports生成显示付款列表的 pdf,每页一个实体。 代码(对于一个实体):
Map<String, Object> parameters = new HashMap<String, Object>();
JasperReport jasperReport = (JasperReport) JRLoader.loadObjectFromFile(path + "WEB-INF/jasper/PaymentOrder.jasper");
report = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
我需要做的是在一个文件中显示两个实体。 我正在尝试使用子报告来做到这一点。
主报告:
<?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="report name" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<title>
<band height="531" splitType="Stretch">
<textField isBlankWhenNull="true">
<reportElement x="0" y="0" width="555" height="20"/>
<textElement verticalAlignment="Middle">
<font fontName="Times New Roman" isUnderline="false" pdfEncoding="UTF-8" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA["* MASTER REPORT *"]]></textFieldExpression>
</textField>
<subreport runToBottom="false">
<reportElement positionType="Float" x="0" y="55" width="555" height="15" isPrintInFirstWholeBand="true" isPrintWhenDetailOverflows="true"/>
<dataSourceExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get( "subReport1Params" )]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get( "subReport1" )]]></subreportExpression>
</subreport>
</band>
</title>
</jasperReport>
子报告:
<?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="report name" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
<title>
<band height="531" splitType="Stretch">
<textField isBlankWhenNull="true">
<reportElement x="0" y="0" width="555" height="20"/>
<textElement verticalAlignment="Middle">
<font fontName="Times New Roman" isUnderline="false" pdfEncoding="UTF-8" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}.getString( "user" ) + ": "+$P{REPORT_PARAMETERS_MAP}.get( "user" )]]></textFieldExpression>
</textField>
<textField isBlankWhenNull="true">
<reportElement x="0" y="22" width="555" height="22"/>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font fontName="Times New Roman" isUnderline="false" pdfEncoding="UTF-8" isPdfEmbedded="true"/>
</textElement>
<textFieldExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}.getString( "payment" ) + " № "+$P{REPORT_PARAMETERS_MAP}.get( "docNumber" )+" "+$P{REPORT_RESOURCE_BUNDLE}.getString( "from" ) + " "+$P{REPORT_PARAMETERS_MAP}.get( "date" )]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
代码:
HashMap<String, Object> parameters = getParametersForPayment(doc1, user, locale);
String path = ((WebApplication) Application.get()).getServletContext().getRealPath("/");
File fileSubReport1 = new File(path + "WEB-INF/jasper/PaymentOrder.jasper");
parameters.put("subReport1", JRLoader.loadObject(fileSubReport1));
File f = new File(path + "WEB-INF/jasper/PaymentMaster.jasper");
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(f);
report = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
你是对的,你可以通过REPORT_PARAMETERS_MAP参数或subreportParameter的帮助下,subreportParameterExpression传递参数。
您可以将subreportExpression与参数一起使用。
如果您将REPORT_PARAMETERS_MAP传递给子报表,则无需执行任何其他操作。
你离解决你的任务如此之近。 你的错误是:
$P{REPORT_RESOURCE_BUNDLE}
另一个建议是在模板中添加参数声明。 在这种情况下更容易支持报告,这是一种很好的风格。
示例中将使用主报告和两个子报告。 要使用的子报表的名称将通过Java代码中的参数传递。 我将为en_US语言环境添加国际化支持。 只有参数将用于显示数据(没有任何数据源)。
小资源包master_en_US.properties正在使用。
user=User:
payment=Payment:
from=From:
如果我们从Java代码中传递所有参数,有两种方法:我们可以在jrxml文件中声明参数,或者我们可以跳过这一步。 正如我所说,我更喜欢在模板中声明的变体(第一种情况)。
在第一种情况下,模板将是:
<?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="master" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" resourceBundle="master" whenNoDataType="AllSectionsNoDetail">
<parameter name="user" class="java.lang.String" isForPrompting="false"/>
<parameter name="docNumber" class="java.lang.String"/>
<parameter name="date" class="java.lang.String"/>
<parameter name="subReportName" class="java.lang.String">
<defaultValueExpression><![CDATA["subreport_1"]]></defaultValueExpression>
</parameter>
<title>
<band height="241" splitType="Stretch">
<subreport>
<reportElement x="0" y="20" width="326" height="59" uuid="f629d1c8-658f-4ae0-a492-2912a7868e96"/>
<parametersMapExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}]]></parametersMapExpression>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[$P{subReportName} + ".jasper"]]></subreportExpression>
</subreport>
</band>
</title>
</jasperReport>
在第二种情况下:
<?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="master" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" resourceBundle="master" whenNoDataType="AllSectionsNoDetail">
<title>
<band height="241" splitType="Stretch">
<subreport>
<reportElement x="0" y="20" width="326" height="59" uuid="f629d1c8-658f-4ae0-a492-2912a7868e96"/>
<parametersMapExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}]]></parametersMapExpression>
<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
<subreportExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.get("subReportName") + ".jasper"]]></subreportExpression>
</subreport>
</band>
</title>
</jasperReport>
一个子报表将带有参数声明块,而另一个子报表则没有。
subreport_1.jrxml :
<?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="subreport_1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" whenNoDataType="AllSectionsNoDetail">
<parameter name="user" class="java.lang.String" isForPrompting="false"/>
<parameter name="docNumber" class="java.lang.String"/>
<parameter name="date" class="java.lang.String"/>
<title>
<band height="79" splitType="Stretch">
<textField>
<reportElement x="0" y="10" width="400" height="15" />
<textElement textAlignment="Left"/>
<textFieldExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}.getString("user") + " " + $P{user}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="25" width="400" height="15" />
<textElement textAlignment="Left"/>
<textFieldExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}.getString("payment") + " № " + $P{docNumber} + " " +
$P{REPORT_RESOURCE_BUNDLE}.getString("from") + " " + $P{date}]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
subreport_2.jrxml :
<?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="subreport_2" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" whenNoDataType="AllSectionsNoDetail">
<title>
<band height="79" splitType="Stretch">
<textField>
<reportElement x="0" y="10" width="400" height="15" />
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$P{REPORT_RESOURCE_BUNDLE}.getString("user") + " " + $P{REPORT_PARAMETERS_MAP}.get("user")]]></textFieldExpression>
</textField>
</band>
</title>
</jasperReport>
String subreportName;
// some code
JasperReport jasperReport;
try (InputStream inputStream = JRLoader.getResourceInputStream("master.jrxml")) {
jasperReport = JasperCompileManager.compileReport(JRXmlLoader.load(inputStream));
}
Map<String, Object> params = new HashMap<>();
params.put(JRParameter.REPORT_LOCALE, Locale.US);
params.put("user", "Bruce Wayne");
params.put("docNumber", "Some #");
params.put("date", "03.06.2010");
if (!isNullOrEmpty(subreportName)) {
params.put("subReportName", subreportName); // the default name in this case will be set in master report (<defaultValueExpression><![CDATA["subreport_1"]]></defaultValueExpression>)
}
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());
我用PDFExporter和subreport_1的情况下,结果将是:
在subreport_2的情况下,结果将是:
注意事项:
在主要(父文件)
在子(子文件)中enter code here
在 Java 文件 ResourceBundle resourceBundle = ResourceBundle.getBundle("application", new LOCALE("en"));
HashMap 参数 = new HashMap(); parameters.put("REPORT_RESOURCE_BUNDLE", resourceBundle);
JasperFillManager.fillReport(report, parameters, source);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.