DynamicJasper:访问连续报表中动态列的值

时间:2011-06-23 22:18:44

标签: java dynamic-jasper

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

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

到目前为止,我提出的唯一解决方案是让POJO具有一系列属性,例如“column1value”和“column2value”,我将其预加载并用于动态列中的字段引用。我真的不想这样做......有人能想到其他任何选择吗?我缺少什么?

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

1 个答案:

答案 0 :(得分:1)

昨天我正在寻找同样的事情,我遇到了你的帖子(我看到它是最近的)。经过一番搜索,我设法克服了这个问题,所以我觉得与你分享我的发现会很好。

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

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

假设您有以下PoJO

public class MyPOJO{

  private String name;
  private String value;
  //getters, setters etc..
 }

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

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");

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

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