在JasperReport中创建/传递Java bean数据源

时间:2012-07-17 07:21:31

标签: java jasper-reports reporting

我在我的JSF应用程序中使用JasperReport和ireport来动态生成报告。 这就是我想要实现的目标: -

  1. 我的结构(读作HashMap / ArrayList)包含需要传递给报告的数据,以便报告中显示相同的数据。

  2. 我的报告已经包含一个数据源连接,我使用该连接从DB获取一些值并在报告中填充它。

  3. 我正在创建一个子报表,以便对于需要从代码传递的数据,我可以使用子报表并将此子报表嵌入主报表中。

  4. 我的问题是: - 1.我无法将集合(读作HashMap / ArrayList)传递给子报告,用我的代码中的数据填充它。

    我绝对肯定必须有一些方法将整个集合传递到子报表以填充它,我也尝试创建JavaBean数据源连接,但是在创建连接时它会显示缺少类路径条目。

    我无法将相应的类捆绑在jar中并将jar放在classpath中,因为值在结构中不断变化,....

    任何人都可以指导我如何创建/传递java bean数据源到报告,以便可以填充数据......

    请指导......

    更新部分: -

    将参数传递给报告并生成报告的Java代码: -

    public class TestDataSource
    {
        public static void main(String[] args)
        {
    
            try {
                JasperDesign jasperDesign = JRXmlLoader.load("D:\\jasperReports\\subReportDataSource.jrxml");
                JasperReport jasperReport =(JasperReport)JasperCompileManager.compileReport(jasperDesign);
                Map<String,Object> parameters = new HashMap<String,Object>();
                parameters.put ("Title",generateCollection());
    
                JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRBeanCollectionDataSource(generateCollection()));
    
                JasperViewer.viewReport(jasperPrint);
                }catch(Exception e)
                {
                    e.printStackTrace();
                }
        }
    
        public static ArrayList<PersonBean> generateCollection()
        {
            ArrayList<PersonBean> arrlist=new ArrayList<PersonBean>();
            arrlist.add(new PersonBean("A", 20));
            arrlist.add(new PersonBean("B",30));
            arrlist.add(new PersonBean("C",40));
            arrlist.add(new PersonBean("D",50));
            arrlist.add(new PersonBean("E",40));
            arrlist.add(new PersonBean("F",60));
    
            return arrlist;
        }
    

    }

    现在我创建了一个新报告(Report)..在里面我放了一个子报告(Sub-Report)..配置子报告数据源是 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ P {Title})

    连接类型: - 使用数据源连接类型。

    现在在我的子报告中,我刚刚放置了两个静态字段作为名称和年龄。 我如何告诉我的报告/子报告打印值作为正在传递的hashmap中的值。

1 个答案:

答案 0 :(得分:9)

如果您已经拥有DataSource,那么当您填写报告时,您可以通过param Map传递列表/地图。

Map<String, Object> param = new HashMap<String, Object>();
param.put("SUB_DATA_SOURCE", yourList);

JasperFillManager.fillReport(jasperReport, param,
                new JRBeanCollectionDataSource(yourMainListHere));

这样做你必须在MAIN报告中创建一个参数,该参数与你在param Map中设置的名称相同,并且还给它一个Type Class(在我的例子中为List)。

您必须创建子报表元素并将连接类型设置为“使用数据源表达式”,并在“数据源表达式”中设置此项:

new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{SUB_DATA_SOURCE})