zoukankan      html  css  js  c++  java
  • 2019-04-10 集成JasperReport

    1. 报表的制作过程为

      ① 制作.jrxml报表模板文件,并编译成.jasper

      ② 代码处理.jasper文件并填充数据进行输出

    2. 一开始是打算使用iReport作为模板制作工具的,但是有以下局限

    • iReport的最高版本是2014年的5.6版,因此它最多支持JDK7以下版本
    • 现在项目起码用的JDK8,所以需要安装两个以上的JDK
    • 可能是高版本编译出来的JavaBean,所以无法使用iReport进行JavaBean数据源的操作,查找不出属性

    3. 使用Eclipse安装JasperStudio插件

    • 安装完之后不管是打开Eclipse还是打开插件,都会报错,因此卸载掉了

     

    4. 直接下载JasperStudio

    • 使用了一下,发现配置了classpath到我得项目classes下,还是会报找不到class的错
    • 使用JasperStudio导入项目可以直接跟开发工具新建类时选择接口的方式查找到JavaBean
    • 因此目前的方案是:当增加报表.jasper时,使用JasperStudio导入项目处理,生成后回到开发环境刷新资源同步得到

     5. Spring Boot简单集成(为简化直接先在controller层写代码)

      ① 引入依赖

        <dependency>
                <groupId>net.sf.jasperreports</groupId>
                <artifactId>jasperreports</artifactId>
                <version>6.8.0</version>
            </dependency>

      ② 写请求代码(在线查看pdf)

       @RequestMapping("/c02v01/report")
        public void getReport(HttpServletRequest request, HttpServletResponse response) throws Exception {
            Map<String, Object> parameters = new HashMap<String, Object>(16);
    
            // 由jrxml文件编译后生产jasper文件的路径
            String jasperPath = ResourceUtils.getURL("classpath:jasper/report2.jasper").getPath();
            FileInputStream isRef = null;
            ServletOutputStream sosRef = null;
    
            try {
    
                isRef = new FileInputStream(new File(jasperPath));
                sosRef = response.getOutputStream();
                // 组装list数据源
                List<Teacher> list = teacherMaper.selectAll();
    
                JasperRunManager.runReportToPdfStream(isRef, sosRef, parameters, new JRBeanCollectionDataSource(list));
    
                response.setContentType("application/pdf");
    
            } catch (JRException e) {
    
                e.printStackTrace();
            } finally {
                sosRef.flush();
                sosRef.close();
            }
    
        }

    6. JasperReport请求到的PDF中文不显示问题

    • 解决过程1:引入依赖itext-asian 测试结果:无效
    • 解决过程2:引入依赖jasperreports-fonts 测试结果:无效
    • 解决过程3:引入依赖cn.lesper:iTextAsian 测试结果:使用宋体有效

    最终解决:出现这问题的原因是JasperreportStudio里面包含了字体font,但是jasperreports的依赖包并不包含font文件,为了让项目能获得font包,可以增加font配置

      ① 暂时引入jasperreports-fonts 依赖

      ② 把依赖内的jasperreports_extension.properties放入到resource根目录(第二个属性指向自己的配置xml)

    net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
    net.sf.jasperreports.extension.simple.font.families.dejavu=net/sf/jasperreports/fonts/fonts.xml

      ③ 在上述第二个属性路径下取出xml文件,把它放入自己的配置路径下

    <?xml version="1.0" encoding="UTF-8"?>
    <fontFamilies>
     
        <fontFamily name="宋体">
            <normal>net/sf/jasperreports/fonts/dejavu/simsun.ttf</normal>
            <bold>net/sf/jasperreports/fonts/dejavu/simsun.ttf</bold>
            <italic>net/sf/jasperreports/fonts/dejavu/simsun.ttf</italic>
            <boldItalic>net/sf/jasperreports/fonts/dejavu/simsun.ttf</boldItalic>
            <pdfEncoding>Identity-H</pdfEncoding>
            <pdfEmbedded>true</pdfEmbedded>
            <exportFonts>
                <export key="net.sf.jasperreports.html">'宋体', Arial, Helvetica, sans-serif</export>
                <export key="net.sf.jasperreports.xhtml">'宋体', Arial, Helvetica, sans-serif</export>
            </exportFonts>
        </fontFamily>
        
        <!-- fontFamily节点可以配置多个,可以根据studio对应的font-type配置不同的  -->
        <!-- simsun.ttf为对应的font库,可以从window系统下C:WindowsFonts取到放入项目中  -->
    </fontFamilies>

      ④ 可以把以上的打包进jar包中(依赖cn.lesper:iTextAsian就是这样把以上步骤打包成jar的,使用自己的配置记得把该依赖去掉),如果不打包,可以直接跳过这步

      ⑤ 重新启动SpringBoot即可

      ⑥ 去除jasperreports-fonts、cn.lesper:iTextAsian等同结构的依赖(主要是去除多个jasperreports_extension.properties,保留自己要的那个)

      这图就是导入字体库的几个必须文件,分别为指向模板文件与字体库映射的映射文件的配置文件jasperreports_extension.properties、模板文件与字体库映射的映射文件fonts.xml 、字体库文件

  • 相关阅读:
    eclipse springboot运行helloworld错误: 找不到或无法加载主类 xxx.xxx.xxx
    springboot整合quartz并持久化到数据库
    pssh批量管理服务器
    网络拓扑图练习
    网络设备之ospf2
    网络设备之基础配置命令(华为交换机二三层)
    华为交换机配置静态路由
    docker参考文档
    docker系列之镜像服务器
    docker系列之分区挂载和数据卷
  • 原文地址:https://www.cnblogs.com/WongHugh/p/10684811.html
Copyright © 2011-2022 走看看