zoukankan      html  css  js  c++  java
  • 搭建第一个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都是动态获取。

    四:代码:

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

      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中。

  • 相关阅读:
    Python基础之流程控制
    Python基础之深拷贝与浅拷贝
    常见开源告警系统对比分析(prometheus、open-falcon、zabbix)
    prometheus简介
    谈谈业务系统的监控报警
    UML类图与类的关系
    IntelliJ IDEA反向生成UML类图
    UML类图几种关系的总结
    UML类图详解和示例
    leetcode-----43. 字符串相乘
  • 原文地址:https://www.cnblogs.com/haojiahong/p/4729459.html
Copyright © 2011-2022 走看看