记一次jasper的PDF模板父子报表实现功能
记一次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模板父子报表实现功能相关推荐
- html pdf 模板,记一次 HTML 模板 转 PDF
HTM模板的样式和实际转pdf样式会有非常大的差距 获取模板的方式也是十分曲折... 这里记录一下便捷的方式 第一步: 在前端调用windows的打印页面 这里的样式完全和html一一致:左侧 目标打 ...
- pdf模板工具JaspersoftStudio,JasperReport
pdf模板工具JaspersoftStudio,JasperReport 概述 Jaspersoft Studio是JasperReports库和JasperReports服务器的基于Eclip ...
- java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题
1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...
- itextpdf通过pdf模板生成pdf文件
itextpdf通过pdf模板生成pdf文件,设置粗体字体 1.创建pdf模板 2.使用模板生成pdf 3.itext自带的字体列表 4.遇到的坑 1.创建pdf模板 可以使用PDFFescape网站 ...
- PDF模板设计Jaspersoft Studio
Jaspersoft Studio:图形化的报表设计工具,用于设计PDF模板文件 创建一个工程 file-new-project-jaspersoft Studio-jasperReports Pro ...
- java pdf添加图片_java实现在pdf模板的指定位置插入图片
本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextp ...
- android手机生成pdf格式文件,Android根据pdf模板生成pdf文件
1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...
- android程序更改pdf文件格式,Android根据pdf模板生成pdf文件
1 public voidFillPdfTemplate(String id) {2 android.icu.text.SimpleDateFormat simpleDateFormat = 3 ne ...
- java使用itext将图片放到pdf模板的指定位置
java使用itext将图片放到pdf模板的指定位置 前面的准备步骤可以参考我的上一篇文章 这里直接上代码 这里用的图片是路径的形式,还有种情况是图片是base64的时候,这种情况就需要转一下图片格式 ...
最新文章
- 初一下计算机课教案,川教版信息技术七下第1课《计算机资源管理》word教案1
- 自监督3D手部姿态估计方法
- 史诗级画面刷爆全球,尼奥重返矩阵,为崔妮蒂而战!《黑客帝国4》重磅来袭!...
- python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...
- 艾伟也谈项目管理,创业公司技术选型参考
- C语言不用文件系统读取文件,C语言-基础教程-非缓冲文件系统
- 从一道面试题说起—js隐式转换踩坑合集
- (103)FPGA面试题-画出程序所描述的电路原理图(一)
- 测视力距离5米还是3米_多功能视力表灯箱的用法
- Raid0、Raid0+1、Raid1、Raid5四者的区别
- CentOS release5.5 (Final)搭建个人本地网站
- 计划制定与管理-日事清
- 广度优先搜索算法1-已知若干个城市的路线,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。
- Error: Unbalanced delimiter found in string
- 前端项目实战145-React.Fragment
- 投资组合的方差公式推导
- postman里面的mockserver使用方法
- 应用密码学第一章绪论笔记
- 【树模型与集成学习】(task2)代码实现CART树(更新ing)
- 大学计算机专业练指法,大学计算机基础学习教案.docx