当前位置: 代码迷 >> 报表 >> Ireport子表格总结
  详细解决方案

Ireport子表格总结

热度:217   发布时间:2016-05-05 07:48:35.0
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

1 楼 vera_sq 2012-10-22  
你好,有个问题想请教下。我现在导入的子报表大概有5页的样子,现在用subreport导进来不是我想要的,因为高度的原因,可以帮忙看看吗?