转载

搭建第一个web项目:jasperReports+ireport制作pdf报表

一: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都是动态获取。

搭建第一个web项目:jasperReports+ireport制作pdf报表

四:代码:

前台通过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); } 

JasperUtil实现方法:

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文件,我放在了项目中的这个位置:

搭建第一个web项目:jasperReports+ireport制作pdf报表

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();  } } 

五:最终实现效果:

搭建第一个web项目:jasperReports+ireport制作pdf报表

报表中的3条数据都是通过数据库动态获取到的,这就实现了报表的打印功能。

最后自己遇到的问题:

easyUI前台的弹窗是在底层页面上的div生成的,所以一开始使用easyUI的弹窗,生成展现出来的pdf乱码,然后改成浏览器打开新窗口,生成正确。

字体问题用到了simfang.ttf文件,这个需要加入到项目中的classpath中。

正文到此结束
Loading...