将嵌套对象发送到 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.Objector这样的字段类java.util.List,但是如何在这个对象或列表中定义字段?


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

http://img.mukewang.com/618cd6750001823503340214.jpg

更新:


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;

}

万一它嵌套得更多呢?


四季花海
浏览 350回答 1
1回答

慕村9548890

在jrxml你可以定义结构化字段(嵌套对象)是这样的:<field name="dateRange" class="my.package.DateRange">&nbsp; &nbsp; <property name="com.jaspersoft.studio.field.label" value="dateRange"/></field><field name="posts" class="java.util.List">&nbsp; &nbsp; <property name="com.jaspersoft.studio.field.label" value="posts"/></field>然后使用来自嵌套对象的值,如$F{dateRange}.getBegin().但是在您的情况下,您似乎总是有一个主题并为其迭代帖子。那么最好是:将主题作为参数传递:&nbsp;parameters.put("topic", topic)DataSource为帖子创建:JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(topic.getPosts())topic在报告中定义参数:<parameter name="topic" class="my.package.Topic"/>在报告中使用参数表达式呈现主题值:&nbsp;$P{topic}.getTopicName()为报告中的 Post 定义字段在报告中使用$F{postName}详细信息带中的字段(即)呈现帖子值- JasperReport 将自动迭代所有帖子并呈现它们更新(回答问题的更新部分):要呈现Collection(&nbsp;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">&nbsp; &nbsp; <datasetRun subDataset="usersDataSet">&nbsp; &nbsp; &nbsp; &nbsp; <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{users})]]></dataSourceExpression>&nbsp; &nbsp; </datasetRun>&nbsp; &nbsp; ...</jr:table>您还必须subDataset为表定义:<subDataset name="usersDataSet">&nbsp; &nbsp; <field name="userName" class="java.lang.String">&nbsp; &nbsp; &nbsp; &nbsp; <fieldDescription><![CDATA[userName]]></fieldDescription>&nbsp; &nbsp; </field>&nbsp; &nbsp; <field name="userPoints" class="java.lang.Integer">&nbsp; &nbsp; &nbsp; &nbsp; <fieldDescription><![CDATA[userPoints]]></fieldDescription>&nbsp; &nbsp; </field></subDataset>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java