【问题标题】:DynamicJasper: accessing values for dynamic columns in a concatenated reportDynamicJasper:访问串联报告中动态列的值
【发布时间】:2011-06-23 22:18:43
【问题描述】:

我需要在 DynamicJasper 中创建一个包含多个包含不同列的“子报表”的报表。列的数据存储在每个行对象的 HashMap 中。我没有在 DynamicJasper 中找到任何方法来指定列的值应该来自 HashMap 上的特定键。

我发现,如果我构建单个报表,我可以扩展 JRAbstractBeanDataSource 并创建我自己的数据源,该数据源知道如何根据我的字段名称格式正确获取数据。但是,当我使用 addConcatenatedReport 添加多个报告时,“子报告”使用 JRBeanCollectionDataSource 而不是我的自定义数据源。

到目前为止,我想出的唯一解决方案是拥有一个 POJO,它具有一堆属性,例如“column1value”和“column2value”,我预加载并用于动态列中的字段引用。我真的不想这样做...谁能想到其他选择?我有什么遗漏吗?

旁注:为什么不能将自定义数据源类型传递给 addConcatenatedReport 函数?技术问题,还是根本不需要?这似乎是对“动态”报告的普遍需求。

【问题讨论】:

    标签: java dynamic-jasper


    【解决方案1】:

    我昨天在搜索同样的东西,我偶然发现了你的帖子(我看到它是最近的)。经过一番搜索,我设法克服了这个问题,所以我认为很高兴与您分享我的发现。

    我假设您为您的数据定义了一个 POJO,然后将所有这些对象添加到 HashMap(如果我是对的,请纠正我)。

    我所做的是创建一个扩展 HashMap 实现的新对象。 (实际上你不必扩展它,你可以使用 HashMap 对象本身)。所以现在我没有在 HashMap 中包含对象,而是直接为属性插入值。但是让我们添加一些代码块以清除内容:)

    假设你有以下 PoJO

    public class MyPOJO{
    
      private String name;
      private String value;
      //getters, setters etc..
     }
    

    您可以使用 HashMap 以这种方式定义您的对象,而不是将这些不同的对象添加到 List 并将其作为数据源提供:

    Map<String,String> myObject1=new HashMap<String,String>();
    myObject1.put("name","Name1");
    myObject1.put("value","Value1");
    
    Map<String,String> myObject2=new HashMap<String,String>();
    myObject2.put("name","Name2");
    myObject2.put("value","Value2");
    

    定义这些对象后,我们可以将它们添加到列表中并将其作为数据源 (JRBeanCollectionDataSource) 提供。所以每个HashMap的key都被认为是Columns中定义的属性(初始POJO的属性)。

    我不知道我的解决方案是否是最好的,但它对我有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多