如何将 Java bean 属性映射到报告部分字段?
How to map Java bean properties to report part fields?
我正在尝试在我的 Jasper 报告中实现 table 的内容。以下是 Jasper Reports 网站上提供的如何操作的示例:https://sourceforge.net/p/jasperreports/code/ci/jr-6-2-1/tree/jasperreports/demo/samples/tableofcontents/reports/
在上面的示例中,他们 运行 对数据库进行查询以获取数据以填充报告部分*。在我的例子中,我需要用从 JavaBean 获得的数据填充报告部分,但我找不到解决方案。
我想出了如何将数据源作为参数从包装报告传递到报告部分,但我不知道如何在那里使用它以便所有报告部分字段都映射到它。据我所知,定期(没有报告部分)是自动完成的。
到目前为止我做了什么:
- Java 创建报告的代码:
JasperCompileManager.compileReportToFile("TablePart.jrxml", "TablePart.jasper");
JasperReport jasperReport = JasperCompileManager.compileReport("TableOfContentsReport.jrxml");
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(generateBeanList());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<>(), dataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "TableOfContentsReport.pdf");
- Java豆子
public class MyBean {
private Integer orderId;
private String shipName;
private String shipCity;
private String shipCountry;
private Integer total;
public Integer getOrderId() {
return orderId;
}
public void setOrderID(Integer orderId) {
this.orderId = orderId;
}
public String getShipName() {
return shipName;
}
public void setShipName(String shipName) {
this.shipName = shipName;
}
public String getShipCity() {
return shipCity;
}
public void setShipCity(String shipCity) {
this.shipCity = shipCity;
}
public String getShipCountry() {
return shipCountry;
}
public void setShipCountry(String shipCountry) {
this.shipCountry = shipCountry;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
}
- 包装报告 jrxml 模板(TableOfContentsReport.jrxml(link 以上版本的略微修改版本):
<jasperReport ... sectionType="Part" ...>
<group name="dummy">
<groupExpression><![CDATA[]]></groupExpression>
<groupHeader>
...
<part>
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd"
usingCache="true">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA["TablePart.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
</groupHeader>
</group>
</jasperReport>
我发现可以将数据源作为参数从包装报告传递到报告部分:$P{REPORT_DATA_SOURCE}
但是如何在报告部分使用它来映射相应的字段(Jasper Reports 字段到 JavaBean 字段)?现在报告部分中所有声明的字段都评估为空的方式。
- 报告部分(TablePart.jrxml(上面的link的略微修改版本))
<jasperReport ...>
<queryString><![CDATA[]]></queryString>
<field name="orderId" class="java.lang.Integer"/>
<field name="shipName" class="java.lang.String"/>
<field name="shipCity" class="java.lang.String"/>
<field name="shipCountry" class="java.lang.String"/>
...
</jasperReport>
这些是字段(orderId、shipName 等),我需要使用传递的 JavaBean 的相应值进行设置。
*以防万一,以下是报告部分主题的参考:http://jasperreports.sourceforge.net/sample.reference/book/index.html
问题是您传递给子报表的数据源已经使用。
JRDatasource 使用 next 迭代主报表中的详细信息带,并在最后将其传递给子报表。
解法:
传给主报表anew JREmptyDataSource(1)
,只需要1条记录
将您的数据源作为参数传递给 HashMap<String,Object>
es map.put("subreportDataSource",dataSource)
传递给子报告此数据源
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{subreportDataSource}]]></subreportParameterExpression>
</subreportParameter>
跟进问题
is it possible to kind of share one datasource between all report parts?
不是直接作为数据源,但在您的情况下,您可以将 generateBeanList()
作为参数传递 map.put("dsList",generateBeanList())
,然后向每个子报表传递 new JRBeanCollectionDataSource($P{dsList})
我正在尝试在我的 Jasper 报告中实现 table 的内容。以下是 Jasper Reports 网站上提供的如何操作的示例:https://sourceforge.net/p/jasperreports/code/ci/jr-6-2-1/tree/jasperreports/demo/samples/tableofcontents/reports/
在上面的示例中,他们 运行 对数据库进行查询以获取数据以填充报告部分*。在我的例子中,我需要用从 JavaBean 获得的数据填充报告部分,但我找不到解决方案。
我想出了如何将数据源作为参数从包装报告传递到报告部分,但我不知道如何在那里使用它以便所有报告部分字段都映射到它。据我所知,定期(没有报告部分)是自动完成的。
到目前为止我做了什么:
- Java 创建报告的代码:
JasperCompileManager.compileReportToFile("TablePart.jrxml", "TablePart.jasper");
JasperReport jasperReport = JasperCompileManager.compileReport("TableOfContentsReport.jrxml");
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(generateBeanList());
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<>(), dataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "TableOfContentsReport.pdf");
- Java豆子
public class MyBean {
private Integer orderId;
private String shipName;
private String shipCity;
private String shipCountry;
private Integer total;
public Integer getOrderId() {
return orderId;
}
public void setOrderID(Integer orderId) {
this.orderId = orderId;
}
public String getShipName() {
return shipName;
}
public void setShipName(String shipName) {
this.shipName = shipName;
}
public String getShipCity() {
return shipCity;
}
public void setShipCity(String shipCity) {
this.shipCity = shipCity;
}
public String getShipCountry() {
return shipCountry;
}
public void setShipCountry(String shipCountry) {
this.shipCountry = shipCountry;
}
public Integer getTotal() {
return total;
}
public void setTotal(Integer total) {
this.total = total;
}
}
- 包装报告 jrxml 模板(TableOfContentsReport.jrxml(link 以上版本的略微修改版本):
<jasperReport ... sectionType="Part" ...>
<group name="dummy">
<groupExpression><![CDATA[]]></groupExpression>
<groupHeader>
...
<part>
<p:subreportPart xmlns:p="http://jasperreports.sourceforge.net/jasperreports/parts" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/parts http://jasperreports.sourceforge.net/xsd/parts.xsd"
usingCache="true">
<subreportParameter name="REPORT_DATA_SOURCE">
<subreportParameterExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></subreportParameterExpression>
</subreportParameter>
<subreportExpression><![CDATA["TablePart.jasper"]]></subreportExpression>
</p:subreportPart>
</part>
</groupHeader>
</group>
</jasperReport>
我发现可以将数据源作为参数从包装报告传递到报告部分:$P{REPORT_DATA_SOURCE}
但是如何在报告部分使用它来映射相应的字段(Jasper Reports 字段到 JavaBean 字段)?现在报告部分中所有声明的字段都评估为空的方式。
- 报告部分(TablePart.jrxml(上面的link的略微修改版本))
<jasperReport ...>
<queryString><![CDATA[]]></queryString>
<field name="orderId" class="java.lang.Integer"/>
<field name="shipName" class="java.lang.String"/>
<field name="shipCity" class="java.lang.String"/>
<field name="shipCountry" class="java.lang.String"/>
...
</jasperReport>
这些是字段(orderId、shipName 等),我需要使用传递的 JavaBean 的相应值进行设置。
*以防万一,以下是报告部分主题的参考:http://jasperreports.sourceforge.net/sample.reference/book/index.html
问题是您传递给子报表的数据源已经使用。
JRDatasource 使用 next 迭代主报表中的详细信息带,并在最后将其传递给子报表。
解法:
传给主报表a
new JREmptyDataSource(1)
,只需要1条记录将您的数据源作为参数传递给
HashMap<String,Object>
esmap.put("subreportDataSource",dataSource)
传递给子报告此数据源
<subreportParameter name="REPORT_DATA_SOURCE"> <subreportParameterExpression><![CDATA[$P{subreportDataSource}]]></subreportParameterExpression> </subreportParameter>
跟进问题
is it possible to kind of share one datasource between all report parts?
不是直接作为数据源,但在您的情况下,您可以将 generateBeanList()
作为参数传递 map.put("dsList",generateBeanList())
,然后向每个子报表传递 new JRBeanCollectionDataSource($P{dsList})