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:\Windows\Fonts取到放入项目中  -->
</fontFamilies>

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

  ⑤ 重新启动SpringBoot即可

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

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

 

posted @ 2019-04-10 17:31  JaminLee  阅读(533)  评论(0编辑  收藏  举报