Ireport子报表总结

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


Ireport子报表总结_第1张图片

 

入口:

	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中:


Ireport子报表总结_第2张图片


Ireport子报表总结_第3张图片

 

上图指定子报表路径!


Ireport子报表总结_第4张图片

 

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

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

 

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


Ireport子报表总结_第5张图片


Ireport子报表总结_第6张图片

注意地方:

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


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

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

你可能感兴趣的:(Blog,F#)