Skip to main content
 首页 » 编程设计

java中将嵌套对象发送到 Jaspersoft iReport

2025年12月25日55lonelyxmas

我尝试使用 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.Object 这样的字段类或java.util.List ,但是如何定义此对象或列表中的字段?

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

My example

更新:

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

如果它会更加嵌套怎么办?

请您参考如下方法:

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()
  • 定义报告中发布的字段
  • 在报告中使用详细信息区域中的字段(即 $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>