首页 > 解决方案 > 将嵌套对象发送到 Jaspersoft iReport

问题描述

我尝试使用 Jaspersoft iReport 从我的 POJO 创建报告并将其导出为 PDF。

我的 POJO 看起来像这样:

class Topic {
    String topicName
    int topicPoints;
    DateRange dateRange;
    List<Post> posts;
}

class DateRange {
    LocalDate begin;
    LocalDate end;
}

class Post {
    String postName;
    int postPoints;
}

我找到了 JRBeanCollectionDataSource 的解决方案,所以我用一个元素(我的 POJO)创建了列表。

ArrayList<Topic> list = new ArrayList<>();
list.add(topic);
JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(list);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, beanColDataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "C:/jasper/test.pdf");

我对导出简单数据(如字符串、整数等)没有任何问题。

例如,这很好地出口。

class Topic {
    String topicName
    Integer topicPoints;
}

只需:拖放字段 topicName (with "java.lang.String") 和topicPoints(with "java.lang.Integer")

但是如何将我的报告嵌套字段放在 dateRange 或帖子中?

java.lang.Object我看到有类似or的字段类java.util.List,但是如何在这个 Object 或 List 中定义字段?

我理想的解决方案将创建如下报告:

我的例子

更新:

class Topic {
    String topicName
    int topicPoints;
    DateRange dateRange;
    List<Post> posts;
}

class DateRange {
    LocalDate begin;
    LocalDate end;
}

class Post {
    String postName;
    int postPoints;
    List<User> users;
}

class User {
    String userName;
    int userPoints;
}

万一它会更加嵌套呢?

标签: javajasper-reports

解决方案


jrxml可以像这样定义结构化字段(用于嵌套对象):

<field name="dateRange" class="my.package.DateRange">
    <property name="com.jaspersoft.studio.field.label" value="dateRange"/>
</field>
<field name="posts" class="java.util.List">
    <property name="com.jaspersoft.studio.field.label" value="posts"/>
</field>

然后使用来自嵌套对象的值,例如$F{dateRange}.getBegin().


但在你的情况下,你似乎总是有一个主题并为它迭代帖子。那么最好是:

  • 将主题作为参数传递:parameters.put("topic", topic)
  • DataSource为帖子创建:JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(topic.getPosts())
  • topic在报告中定义参数:<parameter name="topic" class="my.package.Topic"/>
  • 在报表中使用参数表达式呈现主题值:$P{topic}.getTopicName()
  • 在报告中为 Post 定义字段
  • 在报表中使用详细信息带中的字段(即$F{postName})呈现帖子值 - JasperReport 将自动迭代所有帖子并呈现它们

更新回答问题的更新部分):要呈现Collection( List) 类型的值,您可以使用子报表 - 请参见此处:在 iReport 中的列表中创建子报表这意味着您将创建子报表来呈现用户值。

或者您可以使用从用户列表创建的用户 table来呈现用户:subDataSet

<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
    <datasetRun subDataset="usersDataSet">
        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{users})]]></dataSourceExpression>
    </datasetRun>
    ...
</jr:table>

您还必须subDataset为表定义:

<subDataset name="usersDataSet">
    <field name="userName" class="java.lang.String">
        <fieldDescription><![CDATA[userName]]></fieldDescription>
    </field>
    <field name="userPoints" class="java.lang.Integer">
        <fieldDescription><![CDATA[userPoints]]></fieldDescription>
    </field>
</subDataset>

推荐阅读