我正在使用Jasper报表以编程方式创建Excel文件。我正在使用Java数据源-一个实现JRDataSource
接口的Java类。到目前为止,我的数据源返回的类实例列表看起来像这样:
public Class MyDataSource implements JRDataSource {
private Integer prop1;
private String prop2;
private String prop3;
...
// getters and setters omitted to save space
}
使用此数据源,我可以创建一个看起来非常漂亮的excel表:
prop1-Header prop2-Header prop3-Header...
----------------------------------------
prop1-value prop2-value prop3-value...
prop1-value prop2-value prop3-value...
...
但是现在MyDataSource
类具有附加属性List<String>
public Class MyDataSource implements JRDataSource {
private Integer prop1;
private String prop2;
private String prop3;
private List<String> subvalues;
...
// getters and setters omitted to save space
}
所以我需要我的Excel看起来像这样
prop1-Header prop2-Header prop3-Header...
----------------------------------------
prop1-value prop2-value prop3-value...
Sub-header1 Sub-header2...
-----------------------
sub-value1 sub-value2....
....
prop1-value prop2-value prop3-value...
Sub-header1 Sub-header2...
-----------------------
sub-value1 sub-value2....
....
...
我设法通过将列表连接成一个字符串来做到这一点,它看起来与我所需要的非常相似。但是我无法对子值数据进行排序和过滤。因此,我实际上需要使其成为子列表或子表。这是我的问题-该怎么做?
搜索了一会后,我找到了解决方案。首先,这是一个非常不错的youtube视频
How to fill Jasper Report Table using Collection of data in Java?
该视频非常详细地展示了如何从Java代码传递到报表中,以及如何使用Datasource Java类。这可以通过执行以下操作来完成:
JRBeanCollectionDataSource detailBean = new JRBeanCollectionDataSource(getMySubvaluesINstancesList());
Map<String, Object> params = new HashMap<>();
params.put("DetailDataSource", detailBean);
jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);
注意名称“ DetailDataSource”。在报告中,您将需要创建一个具有该名称的参数,并将其类型声明为net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
。之后,您将基于基于该参数创建的数据集构建表。但这是上述视频的简短描述。但是,仅此还不能解决问题。集合作为参数传递的剩余问题将只呈现一次,而不会为数据源的每个记录呈现。因此,我们需要做的就是将list属性添加到数据源类中,方法与问题中描述的相同:
public Class MyDataSource implements JRDataSource {
private Integer prop1;
private String prop2;
private String prop3;
private List<String> subvalues;
...
// getters and setters omitted to save space
}
之后,您需要在报表中声明一个名为“ subvalues”的字段,并将其类型声明为java.util.List
。然后根据上述视频更改您创建的数据集的定义。您需要将JRDatasource表达式从$P{yourParameterName}
更改为new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subvalues})
,然后进行宾果游戏!您的集合是数据源的一部分,将为每个记录呈现