Ireport子报表总结

来源:互联网 发布:开罗旅游自助攻略知乎 编辑:程序博客网 时间:2024/05/18 13:07

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


 

入口:

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(), "");//生成pdfif("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

原创粉丝点击