记一次jasper的PDF模板父子报表实现功能

  • 前言
  • 一、具体步骤
    • 1.解决模板问题
      • 难点
      • 模板最终步骤
    • 2.服务端代码
    • 3.接口访问效果
  • 二、总结

前言

近期项目中的心需求是要通过教师提交的听课记录进行PDF打印预览功能,为了实现这个功能我采用jasper的PDF模板+java进行实现
主要工具:idea+studio


需求格式:
其中课堂图片与课堂点评可以多条存在,鉴于这种需求采用jasper的父子报表进行实现.

开始打算使用一个模板进行功能实现,后来发现图片与评论只能取一条,这才意识到图片与评论的话是一个list集合,要进行遍历,所以采用父子报表进行功能实现.下面介绍一下我的实现方法.

一、具体步骤

1.解决模板问题

使用studio进行模板制作
在自己的百度网盘中放了一个版本比较旧的studio,如果有需要的话可以进行下载

https://pan.baidu.com/s/1t9x6KqTxOVcPW2TqkJejQw
提取码: sohy

模板软件的结构如图:

创建新的project,取名为parentPdf,然后创建所需要的Paremeters,如图:

将各个参数拖拽至detail板块中并进行排版:如图

下面的文件为子报表,子报表就是sonPdf那个文件,如图:

注意一点:子报表中的属性不是partemeters,而是field属性.

难点

报表的难点在于父子报表传参问题:
主要解决步骤:

拖拽一个subreport组件进入父报表,然后对改组件进行设置,主要设置两个参数:
1:数据源
2:子报表路径

子报表路径表达式:$P{listPath}
子报表数据源构造:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{commentList})

模板最终步骤

将parentPdf.jrxml文件与sonPdf.jrxml文件进行编译得到两个jasper文件.

2.服务端代码

这里主要是为父子报表进行数据构造与传参.
话不多说,直接上代码

@GetMapping("/downloadMyReport/{id}/myReport.pdf")@IgnoreAuthenticatedpublic void myReport(HttpServletRequest request, HttpServletResponse response, @PathVariable("id") Integer id) throws Exception {// 1.引入jasper文件File file = ResourceUtils.getFile(path + "/parentPdf.jasper");logger.info(file.getPath()+"====================================>>>>");FileInputStream fis = new FileInputStream(file);//2.创建JasperPrint,向jasper文件中填充数据ServletOutputStream os = response.getOutputStream();try {/*** fis: jasper 文件输入流* new HashMap :向模板中输入的参数* JasperDataSource:数据源(和数据库数据源不同)*              填充模板的数据来源(connection,javaBean,Map)*               填充空数据来源:JREmptyDataSource*/File listFile = ResourceUtils.getFile(path + "/sonPdf.jasper");logger.info(listFile.getPath()+"====================================>>>>");/** 构建父报表数据*/Map<String, Object> map = new HashMap<>();map.put("listPath", listFile.getPath());//子报表1路径CampusAttendanceNote campusAttendanceNote = campusAttendanceNoteService.getAttendanceNoteById(id);map.put("teacherName", campusAttendanceNote.getTeacherName() == null ? "未填写" : campusAttendanceNote.getTeacherName());map.put("submitDate", campusAttendanceNote.getCreateTime() == null ? "未填写" : campusAttendanceNote.getCreateTime());map.put("schoolName", campusAttendanceNote.getSpeakSchool() == null ? "未填写" : campusAttendanceNote.getSpeakSchool());map.put("courseName", campusAttendanceNote.getCourseName() == null ? "未填写" : campusAttendanceNote.getCourseName());map.put("courseTeacher", campusAttendanceNote.getSpeakTeacherName() == null ? "未填写" : campusAttendanceNote.getSpeakTeacherName());map.put("topic", campusAttendanceNote.getTopic() == null ? "未填写" : campusAttendanceNote.getTopic());String listenDate = campusAttendanceNote.getListenDate();SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");SimpleDateFormat sdfToDate = new SimpleDateFormat("yyyy-MM-dd");Date _listenDate = sdfToDate.parse(listenDate);String format = sdf.format(_listenDate);System.err.println(format);String dateStr = DateUtils.getDateStr(_listenDate);String resultCourseDate = format + " 第" + campusAttendanceNote.getWeekCount() + "周 " + dateStr + campusAttendanceNote.getPeriod() + " 第" + campusAttendanceNote.getCourseCount() + "节";map.put("courseDate", resultCourseDate);map.put("advice", campusAttendanceNote.getAdvice() == null ? "未填写" : campusAttendanceNote.getAdvice());List<CampusAttendanceCourseComment> list = campusAttendanceNoteService.getCourseNoteByAttendanceId(campusAttendanceNote.getId());map.put("commentList", list);//填充子报表数据JasperPrint print = JasperFillManager.fillReport(fis, map, new JREmptyDataSource());//3.将JasperPrint已PDF的形式输出JasperExportManager.exportReportToPdfStream(print, os);} catch (Exception e) {e.printStackTrace();} finally {os.flush();}}

需要在代码中构造出map,父子报表传参主要通过map中的子报表jasper路径,与子报表的list数据进行传参.

3.接口访问效果

二、总结

这次的技术记录也仅限于自身学习总结,需求来的比较急,以至于代码还有模板都比较粗糙,这次的分享也比较粗糙,还请见谅,至于PDF模板的开发肯定还有各式各样的,如果有其他的技术,还请大家多多的交流一下,文章对大家有所帮助的话,那也是荣幸之至.
还请大家批评指导.

记一次jasper的PDF模板父子报表实现功能相关推荐

  1. html pdf 模板,记一次 HTML 模板 转 PDF

    HTM模板的样式和实际转pdf样式会有非常大的差距 获取模板的方式也是十分曲折... 这里记录一下便捷的方式 第一步: 在前端调用windows的打印页面 这里的样式完全和html一一致:左侧 目标打 ...

  2. pdf模板工具JaspersoftStudio,JasperReport

    pdf模板工具JaspersoftStudio,JasperReport 概述 Jaspersoft    Studio是JasperReports库和JasperReports服务器的基于Eclip ...

  3. java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题

    1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...

  4. itextpdf通过pdf模板生成pdf文件

    itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...

  5. PDF模板设计Jaspersoft Studio

    Jaspersoft Studio:图形化的报表设计工具,用于设计PDF模板文件 创建一个工程 file-new-project-jaspersoft Studio-jasperReports Pro ...

  6. java pdf添加图片_java实现在pdf模板的指定位置插入图片

    本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextp ...

  7. android手机生成pdf格式文件,Android根据pdf模板生成pdf文件

    1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...

  8. android程序更改pdf文件格式,Android根据pdf模板生成pdf文件

    1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...

  9. java使用itext将图片放到pdf模板的指定位置

    java使用itext将图片放到pdf模板的指定位置 前面的准备步骤可以参考我的上一篇文章 这里直接上代码 这里用的图片是路径的形式,还有种情况是图片是base64的时候,这种情况就需要转一下图片格式 ...

最新文章

  1. 初一下计算机课教案,川教版信息技术七下第1课《计算机资源管理》word教案1
  2. 自监督3D手部姿态估计方法
  3. 史诗级画面刷爆全球,尼奥重返矩阵,为崔妮蒂而战!《黑客帝国4》重磅来袭!...
  4. python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...
  5. 艾伟也谈项目管理,创业公司技术选型参考
  6. C语言不用文件系统读取文件,C语言-基础教程-非缓冲文件系统
  7. 从一道面试题说起—js隐式转换踩坑合集
  8. (103)FPGA面试题-画出程序所描述的电路原理图(一)
  9. 测视力距离5米还是3米_多功能视力表灯箱的用法
  10. Raid0、Raid0+1、Raid1、Raid5四者的区别
  11. CentOS release5.5 (Final)搭建个人本地网站
  12. 计划制定与管理-日事清
  13. 广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
  14. Error: Unbalanced delimiter found in string
  15. 前端项目实战145-React.Fragment
  16. 投资组合的方差公式推导
  17. postman里面的mockserver使用方法
  18. 应用密码学第一章绪论笔记
  19. 【树模型与集成学习】(task2)代码实现CART树(更新ing)
  20. 大学计算机专业练指法,大学计算机基础学习教案.docx

热门文章

  1. 关于达梦数据库bak格式文件还原操作
  2. 万象OL免刷 云百度免刷
  3. 从商鞅变法中领会出的职场感悟
  4. ubuntu14.04 下flash_tool问题
  5. HDU 1435 Stable Match (稳定婚姻匹配)
  6. 从牛根生的语录里,你能学到什么吗?
  7. 虚拟化之KVM(上)
  8. java 输出流转输入流_输入输出--Java IO流
  9. [有更新]10分钟教你完成Verilog-Vscode编辑器环境搭建
  10. rss源搜索_如何使用Google图像搜索,RSS源和更多自定义墙纸