Ireport子报表总结

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


 

入口:

Java代码   收藏代码
  1. public ActionForward printVoucher(ActionMapping mapping, ActionForm form,  
  2.         HttpServletRequest request, HttpServletResponse response) throws SystemException {  
  3.     HttpSession session = request.getSession();  
  4.     Hotelbookheader hbh = (Hotelbookheader)session.getAttribute("adminHotelbookheaderDetails");  
  5.     String type = request.getParameter("type");  
  6.     log.info("Test output !");  
  7.     byte[] voucher = null;  
  8.     DynaActionForm updateBookingForm = (DynaActionForm)form;  
  9.     if(type != null && "agent".equalsIgnoreCase(type)) {  
  10.         hbh = (Hotelbookheader)session.getAttribute("HotelbookheaderDetails");  
  11.         voucher =  this.initVoucherPDF(hbh,session,response,updateBookingForm);  
  12.         if(voucher != null) {  
  13.             this.toPdfbytes(response, voucher,  "voucher.pdf");  
  14.         }  
  15.         request.setAttribute(MyConstants.MARKETS_KEY, "Save voucher success");  
  16.         return mapping.findForward("admindetails");  
  17.     }  
  18.       
  19.     hbh.setVoucherRemarks(updateBookingForm.getString("voucherRemarks"));  
  20.     hbh.setIsAllowAgentReprint(new Byte(updateBookingForm.getString("isAllowAgentReprint")));  
  21.     hbh.setRemarks(updateBookingForm.getString("voucherRemarks"));  
  22.     String voucherno = updateBookingForm.getString("voucherno");  
  23.     String agentxonumber = updateBookingForm.getString("agentxonumber");  
  24.               
  25.     AmendBookLogUtils logUtils = new AmendBookLogUtils(request);  
  26.     logUtils.log("Voucher","Voucher Issued", hbh.getBookingno(), "");  
  27.     //生成pdf  
  28.       
  29.     if("dataOnly".equals(updateBookingForm.getString("isPdf"))) {  
  30.         voucher =  this.initBlankVoucherPDF(hbh,session,response,updateBookingForm);  
  31.     }   
  32.     if("withBackground".equals(updateBookingForm.getString("isPdf"))){  
  33.         voucher =  this.initVoucherPDF(hbh,session,response,updateBookingForm);  
  34.     }  
  35.     if(voucher != null) {  
  36.         this.toPdfbytes(response, voucher,  "voucher.pdf");  
  37.         hbh.setStatus(MyConstants.Guarantee);  
  38.     }         
  39.     hotelbookheaderFacade.update(hbh);  
  40.     request.setAttribute(MyConstants.MESSAGE_KEY, "Save voucher success");  
  41.     return mapping.findForward("admindetails");  
  42. }  
 
Java代码   收藏代码
  1. private void toPdfbytes(HttpServletResponse response,byte[] bb,String filename) throws SystemException {  
  2.         response.reset();  
  3.         response.setContentType("APPLICATION/OCTET-STREAM");  
  4.         response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\"");  
  5.         response.setContentLength(bb.length);  
  6.         try {  
  7.             ServletOutputStream ouputStream = response.getOutputStream();  
  8.             ouputStream.write(bb, 0, bb.length);  
  9.             ouputStream.flush();  
  10.             ouputStream.close();  
  11.         } catch (IOException e) {  
  12.             e.printStackTrace();  
  13.             throw new SystemException(e.getMessage());  
  14.         }  
  15. }  

 关键地方:

Java代码   收藏代码
  1. private byte[] initBlankVoucherPDF(Hotelbookheader hbh,HttpSession session,HttpServletResponse response,DynaActionForm updateBookingForm) throws SystemException {  
  2.         String path = "WebRoot/images";  
  3.         if(session != null)  
  4.             path = session.getServletContext().getRealPath("images");  
  5.         log.info(path);  
  6.         Map readMap = updateBookingForm.getMap();  
  7.           
  8.         List<Map<Object, Object>> mapList = new ArrayList<Map<Object,Object>>();  
  9.           
  10.         Map<Object, Object> map = new HashMap<Object, Object>();  
  11.         map.put("neHotelLogo",path + "\\voucher\\NE_hotel_logo.jpg");  
  12.         map.put("neVoucherLogo",path + "\\voucher\\booking.jpg");  
  13.         map.put("roomMessage", roomMessage);          
  14.         map.put("extraBed""Nil");   
  15.           
  16.         //构造两个子报表  
  17.         map.put("passengerList", paxList(hbh,map));       
  18.         map.put("items", itemsList(hbh,updateBookingForm));  
  19.           
  20.         //mapList是fillReport时的数据源 new JRBeanCollectionDataSource(mapList)  
  21.         mapList.add(map);  
  22.                   
  23.         try {             
  24.             byte[] bb = JasperReportUtil.createPdfByXmlName("ServiceVoucher", mapList, session);  
  25.             return bb;  
  26.         } catch (JRException e) {  
  27.             e.printStackTrace();  
  28.         } catch (IOException e) {  
  29.             e.printStackTrace();  
  30.         }  
  31.         return null;  
  32.     }  
 

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

 

子报表的数据封装:  

Java代码   收藏代码
  1. private List itemsList(Hotelbookheader hbh,DynaActionForm updateBookingForm) {  
  2.         Set priceDetailsSet = hbh.getHotelbookpricedetails();  
  3.         List<HotelRoomPriceVO> list = AdminUpdateOrderUtils.initAdminUpdatePriceListVO(updateBookingForm,priceDetailsSet);  
  4.         int num1 = 0;  
  5.         int num2 = 0;  
  6.         int num3 = 0;  
  7.   
  8.         for(int i =0;i<list.size();i++){  
  9.             HotelRoomPriceVO vv = list.get(i);  
  10.             if (vv.getAdditionalitem1paxno() != null  
  11.                     && !vv.getAdditionalitem1paxno().equals("")) {  
  12.                 num1+=Integer.parseInt(vv.getAdditionalitem1paxno());     
  13.             }  
  14.             if (vv.getAdditionalitem2paxno() != null  
  15.                     && !vv.getAdditionalitem2paxno().equals("")) {  
  16.                 num2+=Integer.parseInt(vv.getAdditionalitem2paxno());     
  17.             }  
  18.             if (vv.getAdditionalitem3paxno() != null  
  19.                     && !vv.getAdditionalitem3paxno().equals("")) {  
  20.                 num3+=Integer.parseInt(vv.getAdditionalitem3paxno());  
  21.             }             
  22.               
  23.         List lt = new ArrayList();  
  24.           
  25.         for(int i =0;i<3;i++){  
  26.             HashMap m = new HashMap();  
  27.             if(i==0){  
  28.                 m.put("name", list.get(0).getAdditionalitemname1());  
  29.                 m.put("num", num1);  
  30.             }else if(i == 1){  
  31.                 m.put("name", list.get(0).getAdditionalitemname2());  
  32.                 m.put("num", num2);  
  33.             }else{  
  34.                 m.put("name", list.get(0).getAdditionalitemname3());  
  35.                 m.put("num", num3);  
  36.             }  
  37.             lt.add(m);  
  38.         }         
  39.         return lt;  
  40.     }  
 

 

Java代码   收藏代码
  1. public static List<Map<Object, Object>> paxList(Hotelbookheader hbh,Map<Object, Object> map) {  
  2.         List<Map<Object,Object>> mapList = new ArrayList<Map<Object, Object>>();  
  3.         String roomtype = "";  
  4.         String roomcount = "";  
  5.         Set paxDetailsSet = hbh.getHotelbookpaxdetails();  
  6.           
  7.         for (Iterator iter1 = paxDetailsSet.iterator(); iter1.hasNext();) {  
  8.             Map<Object, Object> paxMap = new HashMap<Object,Object>();  
  9.             Hotelbookpaxdetail pax = (Hotelbookpaxdetail) iter1.next();  
  10.             roomtype = pax.getRoomtype().trim();  
  11.             paxMap.put("gender", pax.getGender() == null ? "" : pax.getGender());  
  12.             paxMap.put("paxname", pax.getGivenname()+"/" + pax.getSurname());  
  13.               
  14.             //一排显示两个  
  15.             if(iter1.hasNext()) {  
  16.                 Hotelbookpaxdetail pax1 = (Hotelbookpaxdetail) iter1.next();  
  17.                 paxMap.put("gender1", pax1.getGender() == null ? "" : pax1.getGender());  
  18.                 paxMap.put("paxname1", pax1.getGivenname()+"/" + pax1.getSurname());  
  19.             }  
  20.             mapList.add(paxMap);  
  21.         }         
  22.         return mapList;  
  23.     }  

 真正导出的部分:

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

Java代码   收藏代码
  1. public static byte[] createPdfByXmlName(String reportName, List<Map<Object,Object>> mapList,HttpSession session) throws JRException, IOException {  
  2.         log.warn("enter createPdfByXmlName");  
  3.         String path = "WebRoot/reports";  
  4.         if (session != null) {  
  5.             path = session.getServletContext().getRealPath("reports");  
  6.         }  
  7.         JasperReport jasperReport;  
  8.         JasperPrint jasperPrint;  
  9.         JRPdfExporter exporter = new JRPdfExporter();  
  10.         ByteArrayOutputStream oStream = new ByteArrayOutputStream();  
  11.         try {  
  12.             File file = new File(path + "/" + reportName + ".jasper");  
  13.             if (!file.exists()) {  
  14.                 JasperCompileManager.compileReportToFile(path + "/"+ reportName + ".jrxml",path + "/"+ reportName + ".jasper");  
  15.                 log.info(reportName + ".jrxml");  
  16.             }             
  17.             jasperReport = (JasperReport) JRLoader.loadObject(file);  
  18.             Map tempMap = new HashMap();  
  19.             tempMap.put("SUBREPORT_DIR", path + "/");  
  20.               
  21.             jasperPrint = JasperFillManager.fillReport(jasperReport, tempMap, new JRBeanCollectionDataSource(mapList));  
  22.             exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);  
  23.             exporter.setParameter(JRPdfExporterParameter.CHARACTER_ENCODING,"UTF-8");  
  24.             exporter.setParameter(JRPdfExporterParameter.OUTPUT_STREAM, oStream);  
  25.             exporter.exportReport();  
  26.             byte[] bytes = oStream.toByteArray();  
  27.             oStream.close();              
  28.             return bytes;  
  29.         }catch(JRException e){  
  30.             e.printStackTrace();              
  31.             throw new JRException(e);  
  32.         }  
  33.     }  

 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值