如何在JasperReports中使用Map作为数据集元素?

时间:2014-12-10 13:39:49

标签: java jasper-reports

我将一个参数传递给Jasper,这是一个Maps的集合。我想将此集合用作表格的数据集。

如果我有一组普通的Java对象,我会这样做:

$F{description}

获得该领域。我想做点什么:

get(description)

values().get(1)

是否可以在这样的表格中检索地图值?

1 个答案:

答案 0 :(得分:0)

由于我真的想保持服务的通用性,我决定用Javassist创建动态类。这是一个丑陋的解决方案,但至少它是有效的。

    HashMap<String, Object> element = (HashMap<String, Object>) ((ArrayCollection) v).get(0);
    ClassPool pool = ClassPool.getDefault();
    CtClass ctClass = pool.makeClass("Dynamic"+System.currentTimeMillis());
    element.keySet().forEach(s -> {
    try {
    //need only Strings
    ctClass.addField(CtField.make("public String "+s+";", ctClass));
    ctClass.addMethod(CtMethod.make("public String get" + StringUtils.capitalize(s) + "() { return " + s + "; }", ctClass));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
    Class clazz = ctClass.toClass();
    ArrayList<Object> objects = new ArrayList<>();
    ((Collection) v).forEach(m -> {
        HashMap<String, Object> hm = (HashMap<String, Object>) m;
        try {
            Object obj = clazz.newInstance();
            element.keySet().forEach(s -> {
                try {
                    obj.getClass().getDeclaredField(s).set(obj, hm.get(s));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        objects.add(obj);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
    parameters.put(k, new JRBeanCollectionDataSource(objects));