【问题标题】:Send nested object to Jaspersoft iReport [duplicate]将嵌套对象发送到 Jaspersoft iReport [重复]
【发布时间】:2018-10-11 10:55:44
【问题描述】:

我尝试使用 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(带有"java.lang.String")和topicPoints(带有"java.lang.Integer"

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

我看到有像java.lang.Objectjava.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;
}

如果它会更加嵌套呢?

【问题讨论】:

    标签: java jasper-reports


    【解决方案1】:

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

    更新回答问题的更新部分):要呈现Collection (List) 类型的值,您可以使用子报告 - 请参见此处: Creating Subreport within list in 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>
    

    【讨论】:

    • 谢谢,让我消化一下,如果一切顺利,我会尽快接受答复。
    • 你能解释一下这个 class="my.package.Topic" 是什么吗?这是我项目中到此文件夹的路径还是什么?我想我没有将 iReport 和项目连接在一起,我单独报告。我做错了吗?
    • 它是完整的 Topic 类名及其包(my.package.Topic 只是示例 - 我不知道你的正确包;-))。您可以使用所有这些 POJO 类创建 jar,并通过 Tools --> Options --> Classpath 将其添加到 iReport 类路径中 --> 添加 JAR
    • 您还可以使用静态方法创建工厂类,该方法将使用一些模拟数据创建Collection&lt;Post&gt;,并将该类也包含在带有 POJO 类的 jar 中。在 iReport 中,您可以将其注册为 JavaBean DataSource 并将其用于测试(更好地预览报告)。有关更多详细信息,您可以查看此处,例如:community.jaspersoft.com/blog/…
    • 答案已更新 - 希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多