搭建第一个web项目:jasperReports+ireport制作pdf报表
2016-07-27 22:13
746 查看
一:jasperReports介绍:
在web应用中,必须面临大量的报表问题,即将数据库中的数据形成报表并进行打印。传统开发只能使用html页面设计报表,效率低且不支持别的格式。所以jasperReports因运而生。jasperReports是一款强大的灵活的报表生成工具,能够生成pdf、html和xml格式的报表,是开源的,可以免费的使用她。并且完全使用java写成,可以用在各种java程序中(她的文档是收费的)。
二:jar说明:
首先,需要往项目中添加的jar文件有:核心包:jasperreports.jar
生成pdf组件包:iText.jar 中文字体包:iTextAsian.jar
apache的commons组件包。
三:ireport介绍:
iReport是一个能够创建复杂报表的开源项目。它100%使用Java语言编写。是目前全球最为流行的开源报表设计器。因为jasperReports本身没有提供很好的可视化报表设计工具,所以iReport很好的弥补了这个问题。下图是自己设计的报表:其中Field和Parameters都是动态获取。
四:代码:
前台通过url访问action中的方法:// pdf打印 public String myprint() throws Exception { InputStream in = userService.genPdf(); ActionContext.getContext().getValueStack().set("pdfStream", in); ActionContext.getContext().getValueStack().set("pdfName", "用户名单.pdf"); return "mypdf"; }
service中的实现方法:
@Override public InputStream genPdf() { List<User> userLs = this.retrieveAll(null, null, null); Map<String, Object> map = new HashMap<String, Object>(); map.put("printDate", CommonUtil.getChineseDate()); return JasperUtil.exportPdfDir("materialCost.jasper", map, userLs); }
package cn.itcast.oa.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.util.List; import java.util.Map; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; /** * 打印工具类 * * @author haojiahong * * @createtime:2015-8-13 下午4:40:27 * * */ public class JasperUtil { public static InputStream exportPdfDir(String fileName, Map<String, Object> maps, List<?> ls) { try { JRDataSource ds = new JRBeanCollectionDataSource(ls, false); String filenurl = PathUtil.getWebPath() + "ireport/" + fileName; InputStream file = new FileInputStream(filenurl); JasperPrint jasperPrint = JasperFillManager.fillReport(file, maps, ds); ByteArrayOutputStream out = new ByteArrayOutputStream(); JasperExportManager.exportReportToPdfStream(jasperPrint, out); return new ByteArrayInputStream(out.toByteArray()); } catch (Exception e) { e.printStackTrace(); } return null; } }
其中的pathUtil是为了获取使用iReport工具设计的报表xml文件,我放在了项目中的这个位置:
pathUtil:
package cn.itcast.oa.util; import java.io.UnsupportedEncodingException; import java.net.URL; import java.net.URLDecoder; public class PathUtil { public String getWebInfPath() { URL url = getClass().getProtectionDomain().getCodeSource() .getLocation(); String path = url.toString(); int index = path.indexOf("WEB-INF"); if (index == -1) { index = path.indexOf("classes"); } if (index == -1) { index = path.indexOf("bin"); } path = path.substring(0, index); if (path.startsWith("zip")) { path = path.substring(4); } else if (path.startsWith("file")) { path = path.substring(6); } else if (path.startsWith("jar")) { path = path.substring(10); } try { path = URLDecoder.decode(path, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } if (path.indexOf(":") < 0) { path = System.getProperty("file.separator") + path; } return path; } public static String getWebPath() { return new PathUtil().getWebInfPath(); } }
五:最终实现效果:
报表中的3条数据都是通过数据库动态获取到的,这就实现了报表的打印功能。
最后自己遇到的问题:
easyUI前台的弹窗是在底层页面上的div生成的,所以一开始使用easyUI的弹窗,生成展现出来的pdf乱码,然后改成浏览器打开新窗口,生成正确。
字体问题用到了simfang.ttf文件,这个需要加入到项目中的classpath中。
相关文章推荐
- ASP.NET--Razor-model-compare属性用法
- aspx脱离源代码管理
- 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“
- 树莓派 Learning 002 装机后的必要操作 --- 01 解决上网问题
- 树莓派 Learning 002 装机后的必要操作 --- 02 解决中文问题
- VB,VBS,VBA,ASP可引用的库参考
- Excel导入---后台下载
- (入门整理学习一)Asp.net core
- 导出Excel--不用安装office
- 使用 asp.net Web API 2的坑
- ASP中生成文本文件的两种方式
- asp.net单点登录(SSO)解决方案,一个实例
- Asp.NET设置Session过期时间的四种方式
- Spring AOP AspectJ切入点语法详解,execution,within,this.......
- 解决asp.net mvc的跨域请求问题
- Asp.Net正则获取页面a标签里的内容
- 异构SOA系统架构之Asp.net实现(兼容dubbo)
- 学习笔记:ASP.NET MVC ModelState验证模型状态
- ASP.NET Core - VSCode安装和配置
- ASP.NET Core - 初期准备