如何将JRBeanCollectionDataSource传递给iReport?

qwe*_*234 4 java datasource jasper-reports javabeans

我目前正在尝试使用jasper来帮助我创建报告.我有这个方法中显示的信息和数据:

private void writeToFile(final List<ScenarioLoadModel> sceneLoadModel) throws Exception {
  final BufferedWriter bw = new BufferedWriter(new FileWriter("/Uma/nft/result.psv"));

  for (final ScenarioLoadModel slm : sceneLoadModel) {
    bw.write(slm.getScenarioId() + PSP + slm.getScenarioId() + PSP + slm.getScenarioConfig().getName() + PSP + slm.getLoad() + PSP + "" + EOL);
    if (!slm.getScenarios().isEmpty()) {
      final int tempCount = slm.getScenarios().get(0).getTemplates().size();
      final int sceneCount = slm.getScenarios().size();
      for (int tempIdx = 0; tempIdx < tempCount; tempIdx++) {
        String id = null;
        int pass = 0;
        int fail = 0;
        final Map<String, BigDecimal> metricMap = new HashMap<String, BigDecimal>();
        final DefaultStatisticalCategoryDataset dataset = new DefaultStatisticalCategoryDataset();
        for (int sceneIdx = 0; sceneIdx < sceneCount; sceneIdx++) {
          final Template temp = slm.getScenarios().get(sceneIdx).getTemplates().get(tempIdx);
          if (temp.isError()) {
            fail++;
          } else {
            pass++;
          }
          if (sceneIdx == 0) {
            id = temp.getId();
          }
          final MetricGroupModel mgm = slm.getScenarios().get(sceneIdx).getMetricGroupModel().get(tempIdx);
          if (mgm != null) {
            for (final MetricModel mm : mgm.getMetricModel()) {
              for (final MetricValue mv : mm.getMetricValue()) {
                dataset.add(mv.getValue(), new BigDecimal(0.0), mv.getType(), id);
              }
            }
          }
        }
        final TemplateConfig tc = TemplateManager.getTemplateConfig(id);

        bw.write(slm.getScenarioId() + PSP);
        bw.write(id + PSP + tc.getName() + PSP + 1 + PSP + pass + "/" + fail);
        for (final Object row : dataset.getRowKeys()) {
          final Number mean = dataset.getValue((String) row, id);
          bw.write(PSP + row + PSP + mean);
        }
        bw.write(EOL);
      }
    }
  }

  bw.close();
}
Run Code Online (Sandbox Code Playgroud)

根据我的理解,我创建了Beans,然后将它们全部放在Bean Factory中,以创建我的对象,该对象将准备传递给iReport.

如何将所有这些信息放入Bean?我基本上希望bean包含场景/测试用例以及它是否通过.(这是用于测试自动化)

Jac*_*oen 7

我试着阅读你的代码,以便最好地猜测你想要的列,但没有上下文,我不知道.所有的豆子都是pojo,有私人田地和公共吸气者和二传手.

假设没有分组,并且基本上每个ScenarioLoadModel都对应于报告中的一行,您最终会得到一个像这样的bean:

public class ScenariaResults {

    private String id;

    private String name;

    private String load;

    private int passCount;

    private int failCount;

    public ScenariaResults(String id, String name, String load, int passCount,
            int failCount) {
        super();
        this.id = id;
        this.name = name;
        this.load = load;
        this.passCount = passCount;
        this.failCount = failCount;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLoad() {
        return load;
    }

    public void setLoad(String load) {
        this.load = load;
    }

    public int getPassCount() {
        return passCount;
    }

    public void setPassCount(int passCount) {
        this.passCount = passCount;
    }

    public int getFailCount() {
        return failCount;
    }

    public void setFailCount(int failCount) {
        this.failCount = failCount;
    }

    @Override
    public String toString() {
        return "ScenariaResults [id=" + id + ", name=" + name + ", load="
                + load + ", passCount=" + passCount + ", failCount="
                + failCount + "]";
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,基本上在上面的代码中,您构建实例ScenarioResults并将它们添加到列表中.获得列表后,您需要做的就是创建一个JRDataSource:

List<ScenarioResults> dataBeanList = ...call your method to get the list of results
//create the datasource
JRDataSource dataSource = new JRBeanCollectionDataSource(dataBeanList);
Run Code Online (Sandbox Code Playgroud)

现在,在iReport中设计报表时,自动导入字段可能有点棘手.基本上首先将你的项目与bean一起添加到iReports中的类路径(可以将它指向bin文件夹或jar文件`):工具 - >选项 - >类路径选项卡.现在,请按照以下步骤添加字段.

  1. 单击以下图标: 创建数据源
  2. 选择JavaBean Datasource选项卡.
  3. 输入bean的类名.(例如ScenarioResults)
  4. 点击 Read attributes
  5. 在报告中突出显示所需的字段,然后单击Add Selected Field(s).
  6. 点击OK.

现在,如果您想测试报告与数据的相似之处,而不仅仅是一个空的数据源,那么这就是Factory的用武之地.它仅用于在使用iReport时进行测试.您需要创建一个基本上为您创建虚拟数据集的类.它应该看起来像:

import java.util.ArrayList;
import java.util.List;

public class ScenarioResultsFactory {

    public static List<ScenarioResults> createBeanCollection() {
        List<ScenarioResults> list = new ArrayList<ScenarioResults>();       
        list.add(new ScenarioResults("1", "test", "load", 10, 5));
        //add as many as you want       
        return list;
    }

}
Run Code Online (Sandbox Code Playgroud)

现在,您需要在iReport中创建指向它的数据源.

  1. 在工具栏中的"数据源"下拉列表旁边,单击带有工具提示"报表数据源"的图标.
  2. 点击New.
  3. 选择JavaBeans set datasource.点击Next.
  4. 输入名称ScenarioResultsFactory.
  5. 对于Factory类,您需要将类名包括在内.所以,如果课程在课程中com你应该在com.ScenarioResultsFactory这里.
  6. 对于静态方法,createBeanCollection如果还没有放在那里.
  7. 选中Use field description复选框.单击Test以确保它有效.
  8. 点击Save.