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 、字体库文件