我需要在DynamicJasper中创建一个包含多个“子报表”的报表,其中包含不同的列。列的数据存储在每个行Object上的HashMap中。我没有在DynamicJasper中找到任何方法来指定列的值应该来自HashMap上的特定键。
我发现如果我构建一个报告,我可以扩展JRAbstractBeanDataSource并创建我自己的数据源,它知道如何根据我格式化字段名称来正确获取数据。但是,当我使用addConcatenatedReport添加多个报表时,“子报表”使用JRBeanCollectionDataSource而不是我的自定义数据源。
到目前为止,我提出的唯一解决方案是让POJO具有一系列属性,例如“column1value”和“column2value”,我将其预加载并用于动态列中的字段引用。我真的不想这样做......有人能想到其他任何选择吗?我缺少什么?
旁注:为什么不能将自定义数据源类型传递给addConcatenatedReport函数的任何想法?技术问题,还是只是不需要?这似乎是对“动态”报告的共同需求。
答案 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的属性)。
我不知道我的解决方案是否最好,但它对我有用!