Java 如何使用Jasper报表创建包含子表的Excel报表

Java 如何使用Jasper报表创建包含子表的Excel报表,java,jasper-reports,export-to-excel,Java,Jasper Reports,Export To Excel,我正在使用Jasper reports以编程方式创建Excel文件。我使用的是Java数据源——一个实现JRDataSource接口的Java类。到目前为止,我的数据源返回的类实例列表如下所示: public Class MyDataSource implements JRDataSource { private Integer prop1; private String prop2; private String prop3; ... // getters and sett

我正在使用Jasper reports以编程方式创建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
}
    JRBeanCollectionDataSource detailBean = new JRBeanCollectionDataSource(getMySubvaluesINstancesList());
    Map<String, Object> params = new HashMap<>();
    params.put("DetailDataSource", detailBean);
    jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);
有了这个数据源,我可以创建一个非常漂亮的excel表格,看起来:

prop1-Header prop2-Header prop3-Header...
----------------------------------------
prop1-value  prop2-value  prop3-value...
prop1-value  prop2-value  prop3-value...
...
但是现在
MyDataSource
类有了额外的属性
List


我通过将列表连接成一个字符串来实现这一点,它看起来与我需要的非常相似。但我没有办法对子值数据进行排序和过滤。所以,我需要把它做成子列表或子表。这是我的问题-怎么做

搜索了一段时间后,我找到了解决方案。首先,这是一个非常好的youtube视频

本视频详细介绍了如何将java代码传递到除Datasource java类之外的其他集合中。这是通过这样做来实现的:

public Class MyDataSource implements JRDataSource {
  private Integer prop1;
  private String prop2;
  private String prop3;
  ...
  // getters and setters omitted to save space
}
    JRBeanCollectionDataSource detailBean = new JRBeanCollectionDataSource(getMySubvaluesINstancesList());
    Map<String, Object> params = new HashMap<>();
    params.put("DetailDataSource", detailBean);
    jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);

在此之后,您需要在报告中声明一个名为“subvalues”的字段,并将其类型声明为
java.util.List
。然后更改根据上面引用的视频创建的数据集的定义。您需要将JRDatasource表达式从
$P{yourParameterName}
更改为
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subvalues})
,并且答对了!您的集合是数据源的一部分,将为每条记录呈现

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
}