【问题标题】:How To Pass a JRBeanCollectionDataSource to iReport?如何将 JRBeanCollectionDataSource 传递给 iReport?
【发布时间】:2012-11-19 14:45:01
【问题描述】:

我目前正在尝试使用 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();
}

据我了解,我创建了 Bean,然后将它们全部放入 Bean 工厂,以创建准备好传递给 iReport 的对象。

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

【问题讨论】:

    标签: java jasper-reports javabeans datasource


    【解决方案1】:

    我试图阅读您的代码,以便最好地猜测您想要哪些列,但没有上下文,我不知道。所有的 bean 都是一个 pojo,具有私有字段和公共 getter 和 setter。

    假设没有分组并且基本上每个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<ScenarioResults> 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<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;
        }
    
    }
    

    现在您需要在 iReport 中创建一个指向它的 Datasource。

    1. 在工具栏中的“数据源”下拉菜单旁边,单击工具提示为“报告数据源”的图标。
    2. 点击New
    3. 选择JavaBeans set datasource。点击Next
    4. 名称输入ScenarioResultsFactory
    5. 对于 Factory 类,您需要输入包含包的类名。因此,如果该类在 com 包中,您应该在此处拥有 com.ScenarioResultsFactory
    6. 对于静态方法,如果还没有,请输入createBeanCollection
    7. 选中Use field description 复选框。点击Test 以确保它有效。
    8. 点击Save

    【讨论】:

    • 哇,这对我帮助很大。谢谢您的答复。这正是我要问的。我很困惑为什么在我看到的所有示例中 Bean Factory 中的所有字段都是硬编码的。太感谢了。我很感激。
    • @qwer1234 没问题,很高兴我能提供帮助。起初我不认为答案会这么长,但当我打字时,它就发生了。
    • 谢谢,哈哈。是的,您的解释非常简单明了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2013-12-06
    • 2012-10-22
    相关资源
    最近更新 更多