java - 将嵌套对象发送到 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;
}
万一它会更加嵌套呢?
解决方案
您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>
推荐阅读
- android - 无法在 Android 项目中设置 ActionBar 文本颜色
- python - 根据条件创建列
- string - 一个 Spark Scala 字符串匹配 UDF
- javascript - 使用 D3.js 将鼠标悬停在圆形数据点上
- email - 可以免费使用 nodemailer 没有重大限制/限制吗?
- python - 如何发送带有段落的消息?
- css - 三 div / 两列布局 - 可以使用 Flexbox 吗?
- android - 颤振)如何更改列表生成器创建的小部件?
- stripe-payments - WoorCommerce Stripe 信用卡字段未显示
- ajax - 通过 Vue3 应用程序传播数据的最佳方式是什么?