`
uule
  • 浏览: 6337961 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Ireport子报表总结

阅读更多

实现效果:点击导出后弹出下载框


 

入口:

	public ActionForward printVoucher(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws SystemException {
		HttpSession session = request.getSession();
		Hotelbookheader hbh = (Hotelbookheader)session.getAttribute("adminHotelbookheaderDetails");
		String type = request.getParameter("type");
		log.info("Test output !");
		byte[] voucher = null;
		DynaActionForm updateBookingForm = (DynaActionForm)form;
		if(type != null && "agent".equalsIgnoreCase(type)) {
			hbh = (Hotelbookheader)session.getAttribute("HotelbookheaderDetails");
			voucher =  this.initVoucherPDF(hbh,session,response,updateBookingForm);
			if(voucher != null) {
				this.toPdfbytes(response, voucher,  "voucher.pdf");
			}
			request.setAttribute(MyConstants.MARKETS_KEY, "Save voucher success");
			return mapping.findForward("admindetails");
		}
		
		hbh.setVoucherRemarks(updateBookingForm.getString("voucherRemarks"));
		hbh.setIsAllowAgentReprint(new Byte(updateBookingForm.getString("isAllowAgentReprint")));
		hbh.setRemarks(updateBookingForm.getString("voucherRemarks"));
		String voucherno = updateBookingForm.getString("voucherno");
		String agentxonumber = updateBookingForm.getString("agentxonumber");
				
		AmendBookLogUtils logUtils = new AmendBookLogUtils(request);
		logUtils.log("Voucher","Voucher Issued", hbh.getBookingno(), "");
		//生成pdf
		
		if("dataOnly".equals(updateBookingForm.getString("isPdf"))) {
			voucher =  this.initBlankVoucherPDF(hbh,session,response,updateBookingForm);
		} 
		if("withBackground".equals(updateBookingForm.getString("isPdf"))){
			voucher =  this.initVoucherPDF(hbh,session,response,updateBookingForm);
		}
		if(voucher != null) {
			this.toPdfbytes(response, voucher,  "voucher.pdf");
			hbh.setStatus(MyConstants.Guarantee);
		}		
		hotelbookheaderFacade.update(hbh);
		request.setAttribute(MyConstants.MESSAGE_KEY, "Save voucher success");
		return mapping.findForward("admindetails");
	}
 
private void toPdfbytes(HttpServletResponse response,byte[] bb,String filename) throws SystemException {
		response.reset();
		response.setContentType("APPLICATION/OCTET-STREAM");
		response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");
		response.setContentLength(bb.length);
		try {
			ServletOutputStream ouputStream = response.getOutputStream();
			ouputStream.write(bb, 0, bb.length);
			ouputStream.flush();
			ouputStream.close();
        } catch (IOException e) {
        	e.printStackTrace();
        	throw new SystemException(e.getMessage());
        }
}

 关键地方:

private byte[] initBlankVoucherPDF(Hotelbookheader hbh,HttpSession session,HttpServletResponse response,DynaActionForm updateBookingForm) throws SystemException {
		String path = "WebRoot/images";
		if(session != null)
			path = session.getServletContext().getRealPath("images");
		log.info(path);
		Map readMap = updateBookingForm.getMap();
		
		List<Map<Object, Object>> mapList = new ArrayList<Map<Object,Object>>();
		
		Map<Object, Object> map = new HashMap<Object, Object>();
		map.put("neHotelLogo",path + "\\voucher\\NE_hotel_logo.jpg");
		map.put("neVoucherLogo",path + "\\voucher\\booking.jpg");
		map.put("roomMessage", roomMessage);		
		map.put("extraBed", "Nil");	
		
		//构造两个子报表
		map.put("passengerList", paxList(hbh,map));		
		map.put("items", itemsList(hbh,updateBookingForm));
		
		//mapList是fillReport时的数据源 new JRBeanCollectionDataSource(mapList)
		mapList.add(map);
				
		try {			
			byte[] bb = JasperReportUtil.createPdfByXmlName("ServiceVoucher", mapList, session);
			return bb;
		} catch (JRException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}
 

数据源是new JRBeanCollectionDataSource(mapList) ,参数是一个List,List中封装了一个Map,基本数据都放在这个Map中
子报表数据分别放入对应的Map中,再将这些Map封装为一个List,传入数据源List的Map,如 map.put("passengerList", paxList(hbh,map))

 

子报表的数据封装:  

private List itemsList(Hotelbookheader hbh,DynaActionForm updateBookingForm) {
		Set priceDetailsSet = hbh.getHotelbookpricedetails();
		List<HotelRoomPriceVO> list = AdminUpdateOrderUtils.initAdminUpdatePriceListVO(updateBookingForm,priceDetailsSet);
		int num1 = 0;
		int num2 = 0;
		int num3 = 0;

		for(int i =0;i<list.size();i++){
			HotelRoomPriceVO vv = list.get(i);
			if (vv.getAdditionalitem1paxno() != null
					&& !vv.getAdditionalitem1paxno().equals("")) {
				num1+=Integer.parseInt(vv.getAdditionalitem1paxno());	
			}
			if (vv.getAdditionalitem2paxno() != null
					&& !vv.getAdditionalitem2paxno().equals("")) {
				num2+=Integer.parseInt(vv.getAdditionalitem2paxno());	
			}
			if (vv.getAdditionalitem3paxno() != null
					&& !vv.getAdditionalitem3paxno().equals("")) {
				num3+=Integer.parseInt(vv.getAdditionalitem3paxno());
			}			
			
		List lt = new ArrayList();
		
		for(int i =0;i<3;i++){
			HashMap m = new HashMap();
			if(i==0){
				m.put("name", list.get(0).getAdditionalitemname1());
				m.put("num", num1);
			}else if(i == 1){
				m.put("name", list.get(0).getAdditionalitemname2());
				m.put("num", num2);
			}else{
				m.put("name", list.get(0).getAdditionalitemname3());
				m.put("num", num3);
			}
			lt.add(m);
		}		
		return lt;
	}
 

 

public static List<Map<Object, Object>> paxList(Hotelbookheader hbh,Map<Object, Object> map) {
		List<Map<Object,Object>> mapList = new ArrayList<Map<Object, Object>>();
		String roomtype = "";
		String roomcount = "";
		Set paxDetailsSet = hbh.getHotelbookpaxdetails();
		
		for (Iterator iter1 = paxDetailsSet.iterator(); iter1.hasNext();) {
			Map<Object, Object> paxMap = new HashMap<Object,Object>();
			Hotelbookpaxdetail pax = (Hotelbookpaxdetail) iter1.next();
			roomtype = pax.getRoomtype().trim();
			paxMap.put("gender", pax.getGender() == null ? "" : pax.getGender());
			paxMap.put("paxname", pax.getGivenname()+"/" + pax.getSurname());
			
			//一排显示两个
			if(iter1.hasNext()) {
				Hotelbookpaxdetail pax1 = (Hotelbookpaxdetail) iter1.next();
				paxMap.put("gender1", pax1.getGender() == null ? "" : pax1.getGender());
				paxMap.put("paxname1", pax1.getGivenname()+"/" + pax1.getSurname());
			}
			mapList.add(paxMap);
		}		
		return mapList;
	}

 真正导出的部分:

导出Excel只需将JRPdfExporter exporter = new JRPdfExporter(); 换为JExcelApiExporter exporter = new JExcelApiExporter();即可!

public static byte[] createPdfByXmlName(String reportName, List<Map<Object,Object>> mapList,HttpSession session) throws JRException, IOException {
		log.warn("enter createPdfByXmlName");
		String path = "WebRoot/reports";
		if (session != null) {
			path = session.getServletContext().getRealPath("reports");
		}
		JasperReport jasperReport;
		JasperPrint jasperPrint;
		JRPdfExporter exporter = new JRPdfExporter();
		ByteArrayOutputStream oStream = new ByteArrayOutputStream();
		try {
			File file = new File(path + "/" + reportName + ".jasper");
			if (!file.exists()) {
				JasperCompileManager.compileReportToFile(path + "/"+ reportName + ".jrxml",path + "/"+ reportName + ".jasper");
				log.info(reportName + ".jrxml");
			}			
			jasperReport = (JasperReport) JRLoader.loadObject(file);
			Map tempMap = new HashMap();
			tempMap.put("SUBREPORT_DIR", path + "/");
			
			jasperPrint = JasperFillManager.fillReport(jasperReport, tempMap, new JRBeanCollectionDataSource(mapList));
			exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);
			exporter.setParameter(JRPdfExporterParameter.CHARACTER_ENCODING,"UTF-8");
			exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, oStream);
			exporter.exportReport();
			byte[] bytes = oStream.toByteArray();
			oStream.close();			
			return bytes;
		}catch(JRException e){
			e.printStackTrace();			
			throw new JRException(e);
		}
	}

 Ireprot中:



 

上图指定子报表路径!


 

此处的$F{items}即为数据源List的Map中封装的子报表的List,与上面对应

另:此处必须使用JRBeanCollectionDataSource的全路径,否则会报错!

 

注意此处items字段的类型为java.util.ArrayList,如图:



注意地方:

子报表大小刚刚放下数据即可,不可留太多空白,子报表页面的大小就是它在父报表中所占的大小!


详细子报表还可参考网上的这个例子:

http://hi.baidu.com/q2881818/blog/item/765cefb3d79e13aed9335ab6.html

 

几个很有价值的子报表文章:

iReport 中父报表给子报表传参数
http://wenku.baidu.com/view/48c139ece009581b6bd9eb88.html
iReport 4.1 报表制作,子报表,实例解析
http://blog.csdn.net/q326527970/article/details/7049047
ireport 的一些技巧
http://azrael6619.iteye.com/blog/753877

  • 大小: 31.8 KB
  • 大小: 32.7 KB
  • 大小: 34.4 KB
  • 大小: 35.2 KB
  • 大小: 4.9 KB
  • 大小: 11 KB
分享到:
评论
2 楼 Angel_99 2015-05-13  
楼主,我想请教下,我用的是struts2是struts2-core-2.3.15.1版本,ireport是使用的jasperreports-5.2.0版本,我现在一直打不出来东西,我就画了一个很简单的静态页面来测试,都打不出来东西,是我的struts2版本和ireport版本不匹配造成的吗?
1 楼 vera_sq 2012-10-22  
你好,有个问题想请教下。我现在导入的子报表大概有5页的样子,现在用subreport导进来不是我想要的,因为高度的原因,可以帮忙看看吗?

相关推荐

    ireport4.5.1制作报表、子报表的完整过程

    总结起来,iReport 4.5.1提供了强大的报表设计功能,无论是简单的数据列示还是复杂的子报表嵌套,都能轻松应对。通过熟练掌握这些步骤,开发者可以为业务提供直观、丰富的数据展示,从而提升数据分析和决策效率。

    struts2+jasperReport+ireport做报表总结

    总之,使用Struts2、JasperReport和iReport开发报表时,要关注数据源配置、中文支持、Struts2与报表之间的交互以及子报表的参数传递。遇到问题时,多参考官方文档、社区资源,结合错误信息进行排查,往往能找到合适...

    ireport制作子报表,springmvc

    现在我们将深入探讨如何在`SpringMVC`项目中利用`ireport`来制作子报表。 一、`ireport`简介 `ireport`是一款基于`JasperReports`的报表设计工具,提供直观的图形化界面,允许开发者无需编写代码就能设计复杂的报表...

    ireport分组与子报表的区别

    在iReport设计工具中,分组(Grouping)与子报表(Subreport)是两种不同的报表组织和数据呈现方式。本文将重点介绍这两种功能的区别及其应用场景。 ### 一、分组(Grouping) #### 1.1 定义 分组是指在报表中对...

    ireport子表详解

    总结,ireport子表是增强报表功能、提升数据分析能力的有效手段。熟练掌握子表的设计和使用,能够帮助我们构建出更加丰富、多维度的报表,为业务决策提供有力的支持。在实际项目中,应结合具体需求灵活运用,不断...

    (七)Ireport做报表数据总计,如:所有员工薪水总和

    总结起来,IReport是实现报表设计和数据总计的强大工具,通过它可以轻松地从数据库中提取数据,进行聚合计算,生成具有总计的员工薪水报表。对于任何需要统计和展示数据的应用,掌握IReport的使用都是十分有益的。

    JasperReports结合iReport制作报表教程

    2. **子报表**:一个主报表中可以嵌套多个子报表,实现复杂的数据结构展现。 3. **图表组件**:JasperReports提供了丰富的图表组件,如柱状图、饼图等,方便数据的可视化展示。 4. **分组与排序**:可以根据需要对...

    java+ireport报表开发实例

    iReport还支持子报表、交叉表、自定义函数、图表样式自定义等功能,满足复杂报表需求。例如,通过子报表可以将多个相关的小报表组合成一个大的报表,提高报表的组织性和可读性。 七、实际应用案例 在Java Web项目...

    IReport报表制作详解

    5. **子报表和分组**:对于复杂报表,可以使用子报表来嵌套报表,或者使用分组功能对数据进行分类展示。 四、JasperReport与IReport的配合 "IReport.doc"文档可能详细介绍了如何将IReport设计的报表与JasperReport...

    iReport-5.6.0 报表制作软件

    4. 子报表:如果报表内容复杂,可以使用子报表来组织和重用部分设计。 四、报表导出与打印 iReport设计的报表可以导出为各种格式,如PDF、Excel、HTML、CSV等,方便用户在不同场景下使用。此外,还支持直接打印...

    ireport的使用总结

    ### iReport 使用总结与关键技术点解析 #### 一、iReport 概述 iReport 是一款功能强大的报表设计工具,广泛应用于 Java 开发环境中。它能够帮助开发者轻松地设计并生成各种格式的报表,包括 PDF 和 Excel 等。...

    Jasperreports+Ireport的使用总结

    通过阅读博文“[报表总结.doc](报表总结.doc)”(未提供具体内容,实际学习时需要查阅该文档),你可以深入理解 JasperReports 和 iReport 的用法,以及它们在实际项目中的应用。同时,实践中应多尝试设计不同类型的...

    irepor子报表文档

    ### iReport子报表详解 #### 一、引言 在报表设计领域,iReport作为一款强大的工具被广泛应用于创建各种复杂报表。其中,子报表功能是实现数据分层展示的关键技术之一。本文将通过一个具体的例子——“员工地址”...

    jasperreport+ireport开发java报表入门级教程(完整版).

    - **子报表**:可以在主报表中嵌套其他报表,实现复杂布局。 #### 实战案例分析 - **销售报告**:展示某一时间段内的销售额、产品分类、地区分布等信息。 - **库存报告**:显示库存产品的数量、价值以及过期预警等...

    用子表的方式解决ireport相同列合并问题

    总结来说,解决ireport中相同列合并问题的关键步骤包括创建主报表和子报表,设置数据源和参数传递,以及确保行高的一致性。通过这种方式,我们可以利用子报表的强大功能来实现复杂的报表设计需求,提升报表的质量和...

    Jasperreport+ireport学习笔记4

    4. **参数传递**:配置子报表参数,确保主报表中的`CUSTNAME`字段值能够作为参数传递给子报表,从而实现实时数据筛选。 5. **预览与调试**:保存并运行主报表,检查复合报表的显示效果,确保所有数据和布局符合预期...

    iReport(java报表开发工具使用教程)

    1. 子报表:在一个报表中嵌入另一个报表,用于展示分组数据或其他复杂结构。 2. 联合报表:整合多个数据源,实现跨库数据联合查询。 3. 表达式和脚本:使用Java和Groovy脚本处理复杂逻辑和自定义函数。 4. 自定义...

    ireport使用subdataset主表和子数据集进行参数传递

    总结来说,通过在 iReport 中巧妙地使用 `subdataset` 和参数传递,我们可以创建动态、交互式的报表,使得用户可以根据需要筛选和查看数据。这在处理复杂报表结构和多层级数据时特别有用。记住,正确配置数据集、...

    iReport报表开发实例帮助手册

    1. 子报表:当一个报表无法容纳所有信息时,可以嵌套子报表来组织复杂内容。 2. 参数:报表可以接受外部输入参数,根据参数值动态生成报表内容。 3. 分组和排序:可以对数据进行分组和排序,便于分析和展示。 4. ...

    iReport+jasperReports开发java Application报表

    在实际开发中,还需要考虑一些高级特性,如子报表、分组、汇总、条件格式化和交互式报表。iReport提供了这些高级功能的可视化编辑,而JasperReports库则提供了相应的API来实现它们。 例如,子报表允许你在主报表中...

Global site tag (gtag.js) - Google Analytics