如何使用Jasper报告创建带有子表的Excel报告

问题描述 投票:-1回答:1

我正在使用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....
                                         ....
...

我设法通过将列表连接成一个字符串来做到这一点,它看起来与我所需要的非常相似。但是我无法对子值数据进行排序和过滤。因此,我实际上需要使其成为子列表或子表。这是我的问题-该怎么做?

java jasper-reports export-to-excel
1个回答
0
投票

搜索了一会后,我找到了解决方案。首先,这是一个非常不错的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}),然后进行宾果游戏!您的集合是数据源的一部分,将为每个记录呈现

© www.soinside.com 2019 - 2024. All rights reserved.