如何将JRBeanCollectionDataSource传递给iReport?

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

private void writeToFile(final List 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 metricMap = new HashMap(); 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(); } 

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

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

我试着阅读你的代码,以便最好地猜测你想要的列,但没有上下文,我不知道。 所有的豆子都是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 + "]"; } } 

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

 List dataBeanList = ...call your method to get the list of results //create the datasource JRDataSource dataSource = new JRBeanCollectionDataSource(dataBeanList); 

现在,在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 createBeanCollection() { List list = new ArrayList(); list.add(new ScenarioResults("1", "test", "load", 10, 5)); //add as many as you want return list; } } 

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

  1. 在工具栏中的“数据源”下拉列表旁边,单击带有工具提示“报表数据源”的图标。
  2. 单击New
  3. 选择JavaBeans set datasource 。 单击Next
  4. 对于name,输入ScenarioResultsFactory
  5. 对于Factory类,您需要将classname包括在内。 因此,如果该类在com包中,则应在此处具有com.ScenarioResultsFactory
  6. 对于静态方法,如果尚未存在createBeanCollection
  7. 选中Use field description复选框。 单击“ Test以确保其有效。
  8. 单击Save