为了账号安全,请及时绑定邮箱和手机立即绑定

将嵌套对象发送到 Jaspersoft iReport

将嵌套对象发送到 Jaspersoft iReport

四季花海 2021-11-11 16:37:51
我尝试使用 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.Objector这样的字段类java.util.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;}万一它嵌套得更多呢?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

在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 将自动迭代所有帖子并呈现它们

更新回答问题的更新部分):要呈现CollectionList)类型的值,您可以使用子报表 - 请参阅此处:在 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>


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 336 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信