- 浏览: 6359151 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (745)
- JQuery (25)
- JS (33)
- 数据库 (59)
- Java基础 (56)
- JSON (8)
- XML (8)
- ireport (7)
- 设计模式 (10)
- 心情 (14)
- freemarker (1)
- 问题 (15)
- powerdesigner (2)
- CSS (15)
- DWR (4)
- tomcat (16)
- Hibernate (12)
- Oracle (7)
- Struts (7)
- Spring (34)
- JSP (23)
- 需学习 (64)
- 工具类库 (63)
- Maven (14)
- 笔试题 (34)
- 源码学习 (31)
- 多线程 (39)
- Android (32)
- 缓存 (20)
- SpringMVC (14)
- jQueryEasyUi (12)
- webservice-RPC (13)
- ant (1)
- ASP.NET (10)
- 正则表达式 (3)
- Linux (15)
- JBoss (1)
- EJB (3)
- UML (2)
- JMS (3)
- Flex (8)
- JSTL (2)
- 批处理 (5)
- JVM (16)
- 【工具】 (16)
- 数据结构 (29)
- HTTP/TCP/Socket (18)
- 微信 (1)
- tomcat源码学习 (15)
- Python (30)
- 主机 (2)
- 设计与架构 (19)
- thrift-RPC (2)
- nginx (6)
- 微信小程序 (0)
- 分布式+集群 (12)
- IO (1)
- 消息队列 (4)
- 存储过程 (8)
- redis (9)
- zookeeper (5)
- 海量数据 (5)
最新评论
-
360pluse:
技术更新,战术升级!Python爬虫案例实战从零开始一站通网盘 ...
Python爬虫实战:Scrapy豆瓣电影爬取 -
18335864773:
推荐用 pageoffice 组件生成 word 文件。
JAVA生成WORD工具类 -
jjhe369:
LISTD_ONE 写道起始地址为163.135.0.1 结束 ...
IP地址与CIDR -
baojunhu99:
private final int POOL_SIZE = 5 ...
使用CompletionService获取多线程返回值 -
LovingBaby:
胡说,javascript 运行时是单线程的,event lo ...
Ajax请求是否可以实现同步
实现效果:点击导出后弹出下载框
入口:
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
评论
发表评论
-
Ireport交叉报表
2011-10-11 10:05 65561、构造数据源: package test; im ... -
Ireprot需注意的问题
2011-05-27 10:52 2122百度JS图表工具Echarts http://echar ... -
使用报表开发工具Ireport生成Pdf报表的总结
2011-03-11 15:02 13552一、个人总结 要使用Ireport,首先都要 ... -
iReport使用教程[转]+总结+模版
2010-09-30 23:12 19114Jasperreport是一个报表制作程序 ,用户需要按照它制 ... -
iReport默认参数和变量的含义解析【转】
2010-09-29 17:39 255761. 变量: ... -
iReport输出为HTML或PDF、XLS、DOC【输出HTML两种方法】
2010-09-29 13:42 3951//ireport 导出word格 ...
相关推荐
总之,使用Struts2、JasperReport和iReport开发报表时,要关注数据源配置、中文支持、Struts2与报表之间的交互以及子报表的参数传递。遇到问题时,多参考官方文档、社区资源,结合错误信息进行排查,往往能找到合适...
现在我们将深入探讨如何在`SpringMVC`项目中利用`ireport`来制作子报表。 一、`ireport`简介 `ireport`是一款基于`JasperReports`的报表设计工具,提供直观的图形化界面,允许开发者无需编写代码就能设计复杂的报表...
在iReport设计工具中,分组(Grouping)与子报表(Subreport)是两种不同的报表组织和数据呈现方式。本文将重点介绍这两种功能的区别及其应用场景。 ### 一、分组(Grouping) #### 1.1 定义 分组是指在报表中对...
总结,ireport子表是增强报表功能、提升数据分析能力的有效手段。熟练掌握子表的设计和使用,能够帮助我们构建出更加丰富、多维度的报表,为业务决策提供有力的支持。在实际项目中,应结合具体需求灵活运用,不断...
总结起来,iReport 4.5.1提供了强大的报表设计功能,无论是简单的数据列示还是复杂的子报表嵌套,都能轻松应对。通过熟练掌握这些步骤,开发者可以为业务提供直观、丰富的数据展示,从而提升数据分析和决策效率。
总结起来,IReport是实现报表设计和数据总计的强大工具,通过它可以轻松地从数据库中提取数据,进行聚合计算,生成具有总计的员工薪水报表。对于任何需要统计和展示数据的应用,掌握IReport的使用都是十分有益的。
2. **子报表**:一个主报表中可以嵌套多个子报表,实现复杂的数据结构展现。 3. **图表组件**:JasperReports提供了丰富的图表组件,如柱状图、饼图等,方便数据的可视化展示。 4. **分组与排序**:可以根据需要对...
iReport还支持子报表、交叉表、自定义函数、图表样式自定义等功能,满足复杂报表需求。例如,通过子报表可以将多个相关的小报表组合成一个大的报表,提高报表的组织性和可读性。 七、实际应用案例 在Java Web项目...
总结来说,通过在 iReport 中巧妙地使用 `subdataset` 和参数传递,我们可以创建动态、交互式的报表,使得用户可以根据需要筛选和查看数据。这在处理复杂报表结构和多层级数据时特别有用。记住,正确配置数据集、...
5. **子报表和分组**:对于复杂报表,可以使用子报表来嵌套报表,或者使用分组功能对数据进行分类展示。 四、JasperReport与IReport的配合 "IReport.doc"文档可能详细介绍了如何将IReport设计的报表与JasperReport...
4. 子报表:如果报表内容复杂,可以使用子报表来组织和重用部分设计。 四、报表导出与打印 iReport设计的报表可以导出为各种格式,如PDF、Excel、HTML、CSV等,方便用户在不同场景下使用。此外,还支持直接打印...
### iReport 使用总结与关键技术点解析 #### 一、iReport 概述 iReport 是一款功能强大的报表设计工具,广泛应用于 Java 开发环境中。它能够帮助开发者轻松地设计并生成各种格式的报表,包括 PDF 和 Excel 等。...
通过阅读博文“[报表总结.doc](报表总结.doc)”(未提供具体内容,实际学习时需要查阅该文档),你可以深入理解 JasperReports 和 iReport 的用法,以及它们在实际项目中的应用。同时,实践中应多尝试设计不同类型的...
### iReport子报表详解 #### 一、引言 在报表设计领域,iReport作为一款强大的工具被广泛应用于创建各种复杂报表。其中,子报表功能是实现数据分层展示的关键技术之一。本文将通过一个具体的例子——“员工地址”...
总结来说,解决ireport中相同列合并问题的关键步骤包括创建主报表和子报表,设置数据源和参数传递,以及确保行高的一致性。通过这种方式,我们可以利用子报表的强大功能来实现复杂的报表设计需求,提升报表的质量和...
- **子报表**:可以在主报表中嵌套其他报表,实现复杂布局。 #### 实战案例分析 - **销售报告**:展示某一时间段内的销售额、产品分类、地区分布等信息。 - **库存报告**:显示库存产品的数量、价值以及过期预警等...
4. **参数传递**:配置子报表参数,确保主报表中的`CUSTNAME`字段值能够作为参数传递给子报表,从而实现实时数据筛选。 5. **预览与调试**:保存并运行主报表,检查复合报表的显示效果,确保所有数据和布局符合预期...
1. 子报表:在一个报表中嵌入另一个报表,用于展示分组数据或其他复杂结构。 2. 联合报表:整合多个数据源,实现跨库数据联合查询。 3. 表达式和脚本:使用Java和Groovy脚本处理复杂逻辑和自定义函数。 4. 自定义...
1. 子报表:当一个报表无法容纳所有信息时,可以嵌套子报表来组织复杂内容。 2. 参数:报表可以接受外部输入参数,根据参数值动态生成报表内容。 3. 分组和排序:可以对数据进行分组和排序,便于分析和展示。 4. ...
在实际开发中,还需要考虑一些高级特性,如子报表、分组、汇总、条件格式化和交互式报表。iReport提供了这些高级功能的可视化编辑,而JasperReports库则提供了相应的API来实现它们。 例如,子报表允许你在主报表中...