如何将 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 获得的数据填充报告部分,但我找不到解决方案。

我想出了如何将数据源作为参数从包装报告传递到报告部分,但我不知道如何在那里使用它以便所有报告部分字段都映射到它。据我所知,定期(没有报告部分)是自动完成的。

到目前为止我做了什么:

  1. 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");
  1. 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;
    }
}
  1. 包装报告 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 字段)?现在报告部分中所有声明的字段都评估为空的方式。

  1. 报告部分(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 迭代主报表中的详细信息带,并在最后将其传递给子报表。

解法:

  1. 传给主报表anew JREmptyDataSource(1),只需要1条记录

  2. 将您的数据源作为参数传递给 HashMap<String,Object> es map.put("subreportDataSource",dataSource)

  3. 传递给子报告此数据源

    <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})