我尝试使用 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 ,但是如何定义此对象或列表中的字段?
我理想的解决方案会创建如下报告:
更新:
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>

