`
china_xuxiang
  • 浏览: 2504 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类

在struts2应用中,关于Ireport子报表$F(XXX)作为数据源问题的解决方法

阅读更多
近来要给客户做子报表,采用之前的jasper+ireport来开发,结果发现子报表上数据源是个问题,查了很多技术文章,却被难在了new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{addresses}) 上,发现很多人和我一样,无法解决这个报错问题,好象是只有在struts2应用中才出这个问题。由是搞了一整天,最终得到了一个解决方法,如下:

	 setJasperName("deomReport");
     List slist1=new ArrayList();  
     
     OrderedMap srow = new LinkedMap();
     srow.put("zip", "100000");
     srow.put("address", "北京市**********");
     srow.put("email", "emailname@mailserver.com");
	 slist1.add(srow);
     
     List slist2=new ArrayList(); 
     
     srow = new LinkedMap();
     srow.put("zip", "310012");
     srow.put("address", "杭州**********");
     srow.put("email", "emailname@mailserver.com");
     slist2.add(srow);
     
 	OrderedMap row = new LinkedMap();
	row.put("name", "徐翔");
	row.put("duty", "软件工程师");
	row.put("age", 33);
	row.put("addressList",  new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(slist1));
	list.add(row);
	
	row = new LinkedMap();
	row.put("name", "陈文平");
	row.put("duty", "软件工程师");
	row.put("age", 24);
	row.put("addressList",  new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(slist2));
	list.add(row);
	reportParameters.put("SUBREPORT_DIR", "E:\\\\workspace\\demo\\struts2.1.8.1\\WebRoot\\cn\\com\\jandar\\jasper\\demo\\");
	reportParameters.put("TITLE", "子报表演示样例");
	return "pdf";


 <action name="subReport" class="cn.com.jandar.jasper.demo.JasperReportDemo" method="subReport">
			<!-- 报表返回设定 -->
		    <result name="pdf" type="jasper">
				<param name="location">
					/cn/com/jandar/jasper/demo/${jasperName}.jasper
				</param>
				<param name="imageServletUrl">/cn/com/jandar/jasper/demo/images/</param>
				<param name="dataSource">list</param>
				<param name="format">PDF</param>
				<param name="documentName">subReportPDF</param>
				<param name="reportParameters">reportParameters</param>
			</result>
		</action>


在主报表中添加参数addresslist,并且通过参数属性界面更改参数类型(默认为String类型的),更改为java.lang.Object

打开在主报表中添加的子报表控件的属性面板,查看connection type 属性,选择Use a datasource expression 选项
  • 打开在主报表中添加的子报表控件的属性面板,查看Data Source Expression属性,填写$F{addressList}


  • 这样,子报表中可以得到addressList这个数据源,整个关键在于
    row.put("addressList",  new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(slist2));

    放进主报表数据源的时候要已经是JRBeanCollectionDataSource类型了。
    好了,如果大家还有什么问题可以给我留言
    2
    3
    分享到:
    评论
    5 楼 chenxf84 2016-09-05  
    我这里还是不行,如果不是LinkedMap而是另外一个javabean呢?
    4 楼 yonglongwang 2015-03-01  
    chenming142 写道
       果然可以通过,谢谢了

    3 楼 chenming142 2015-03-01  
       果然可以通过,谢谢了
    2 楼 actuutuu 2014-03-24  
    set集合可以用吗?
    1 楼 laptop 2011-11-04  
    代码能共享下吗,虽然看了你的帖子,不过还是没弄出来, 
    我邮箱:zhazhijun@163.com

    相关推荐

    Global site tag (gtag.js) - Google Analytics