基于前面所讲的基础,若没有一定的入门知识,请看
Jasper(1)——入门
Jasper(2)——简单使用导出PDF报表
报表设计
案例:查询学生信息的所有科目的考试成绩
主表设计(父表)
创建名为“demo4.jrxml”的报表文件,如下图所示
需要的属性
Parameters:subPath(String)
Field:name(String),scoreList(java.util.List)
首先设计主表,如下图所示
子表设计
接下来创建“demo4_sub.jrxml”的报表文件
属性名:subject(String),score(Integer)
之后把报表页面调整主表所需的大小
然后把detail band高度调成30
然后依次设计报表
这样子表就设计好啦~
回到主表
用Subreport组件拖过去
next,勾选这个
然后Finish,之后经过调整,如下图
我们把Detail每一个Text Field框设置一下,如下图
子报表也一样设置
接下来对子报表进一步设置
文件路径我这里改成入参参数
最后一栏的处理
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{scoreList})
net.sf.jasperreports.engine.JRDataSource
最后效果
那么,Preview一下,若没问题就可以编译了;这样,报表设计部分完成~
Java代码导出
本次操作文件如下
StuInfo(父表实体类)
package com.copa.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author copa
* @createDate 2021-07-27 0:19
* @function
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class StuInfo {
private String name;
private List<StuScore> scoreList;
}
StuScore(子表实体类)
package com.copa.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author copa
* @createDate 2021-07-27 0:19
* @function
*/
@Data
@NoArgsConstructor
@Accessors(chain = true)
public class StuScore {
private String subject;
private Integer score;
}
controller
@RequestMapping(value = "/pdf4")
public void pdf4(Map<String, Object> parameters,
HttpServletResponse response) throws IOException {
ServletOutputStream os = response.getOutputStream();
try {
ArrayList<StuInfo> list = new ArrayList<>();
for (int i = 1; i <= 4; i++) {
StuInfo stuInfo = new StuInfo();
ArrayList<StuScore> stuScoreList = new ArrayList<>();
for (int j = 1; j <= 3; j++) {
StuScore stuScore = new StuScore();
stuScore.setSubject(j == 1 ? "语文" :
j == 2 ? "数学" : "英语")
.setScore(new Random().nextInt(100 + 1));
stuScoreList.add(stuScore);
}
stuInfo.setName("小" + i)
.setScoreList(stuScoreList);
list.add(stuInfo);
}
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
parameters = parameters == null ? new HashMap<>() : parameters;
parameters.put("subPath", new ClassPathResource("jasper/demo4_sub.jasper").getPath());
ClassPathResource resource = new ClassPathResource("jasper/demo4.jasper");
response.setContentType("application/pdf");
InputStream jasperStream = resource.getInputStream();
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperStream, parameters, dataSource);
JasperExportManager.exportReportToPdfStream(jasperPrint, os);
} catch (JRException e) {
e.printStackTrace();
} finally {
os.flush();
}
}
确认无误后,启动项目进行测试~
http://localhost:8080/pdf4
若看到下图效果,就证明是成功了~
好啦,我个人大致常用的Jasper就这几个,以后若有啥补充的…emm…以后再说哈~先当笔记存着哈O(∩_∩)O
项目地址:https://gitee.com/copaa/jasperdemo
Jasper(1)——入门
Jasper(2)——简单使用导出PDF报表
Jasper(3)——制作图表报表
Jasper(4)——制作分组报表
Jasper(6)——小技巧& 各种bug(有缘再补充)