如何将JRBeanCollectionDataSource传递给iReport? - java

我目前正在尝试使用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 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<ScenarioResults> dataBeanList = ...call your method to get the list of results
//create the datasource
JRDataSource dataSource = new JRBeanCollectionDataSource(dataBeanList);

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

  • 单击以下图标:
  • 选择JavaBean Datasource选项卡。
  • 输入您的bean的类名。 (例如ScenarioResults)
  • 单击Read attributes
  • 突出显示报告中所需的字段,然后单击Add Selected Field(s)
  • 单击OK
  • 现在,如果您要测试报表的数据外观,而不仅仅是空数据源,这就是工厂的所在。仅用于在使用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中创建一个指向它的数据源。

  • 在工具栏中的数据源下拉列表旁边,单击带有工具提示`Report Datasources的图标。
  • 单击New
  • 选择JavaBeans set datasource。点击Next
  • 输入名称ScenarioResultsFactory作为名称。
  • 对于Factory类,您需要输入包含包的类名。因此,如果该类在com包中,则应在此处输入com.ScenarioResultsFactory
  • 对于静态方法,如果尚未放置createBeanCollection,则输入Use field description
  • 选中Test复选框。单击Save以确保它起作用。
  • 单击ojit_code。
  • Java:我可以在Hashmaps中使用数组吗? - java

    我可以在Hashmaps中使用数组吗?如果是这样,则声明这种哈希图的确切语法是什么?谢谢 参考方案 数组也是对象。甚至像int[]这样的原始数组。Map<String,String[]> map = new HashMap<String,String[]>();

    Java:找到特定字符并获取子字符串 - java

    我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

    Java-搜索字符串数组中的字符串 - java

    在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…

    Java string.hashcode()提供不同的值 - java

    我已经在这个问题上停留了几个小时。我已经注释掉所有代码,认为这与数组超出范围有关,但是这种情况仍在发生。我正在尝试使用扫描仪从文件中读取输入,存储数据并稍后使用哈希码获取该数据。但是哈希值不断变化。public static void main(String[] args) { //only prior code is to access data char…

    在Java中使用新关键字和直接赋值的字符串 - java

    String s="hi"; String s1=new String("hi"); 从内存角度看,s和s1存储在哪里?无论是在堆内存还是堆栈中。s指向“ hi”,而s1指向hi存在的内存位置?请帮忙? 参考方案 考虑以下 String s = "hi"; String s1 = new Strin…