目录
1、TIBCO Jaspersoft Studio安装
2、Jaspersoft Studio使用
2.1 创建一个JasperReports Project
2.2 创建报表模板
2.3 设计报表模板
2.4 导出可执行模板
3、Jaspersoft 汉化注意事项
4、引入JasperReports相关依赖
5、Jasper报表模板数据填充及PDF下载
1、TIBCO Jaspersoft Studio安装
下载地址:Jaspersoft® Studio | Jaspersoft Community
需要JDK环境并且尽量6.0以上,6.0以下兼容性和汉化支持麻烦(这句基本上是废话了),我这里是安装的社(白)区(嫖)版,Jaspersoft Studio这个工具其实跟Eclipse长得非常像,可以单独安装,也可以Eclipse插件方式安装,甚至可以当成Eclipse工具使用.....
安装完成后看看靓照,是不是很Eclipse?
2、Jaspersoft Studio使用
2.1 创建一个JasperReports Project
工具会帮我们自动加载报表开发锁需要的依赖包
2.2 创建报表模板
我们的目标效果是设计一个包含主从表的学生成绩统计报表
下面我们开始表演:
1、首先我们先创建一个空白页主模板,操作还是很Eclipse
模板每个部分都解释一下,看下图
同样的方式创建一个子模版,因为一个主模板一般会对应多个子模版,所以我们弄个包包起来,备用:
2.3 设计报表模板
1、main.jrxml 文件Title板块添加标题,标题我使用标签,拖过去对齐成你喜欢的姿势,并且可以对字体“加大加粗”哦:
2、main.jrxml 文件 Page Header 板块加一个日志信息,使用动态标签
创建一个Parameters变量
3、main.jrxml 文件 Column Header增加列头显示,这里使用静态标签就行
4、Detail模块加上需要展示的内容,这个地方是重中之重,唯独只有Detail模块可以有多个,可以右键点击Detail区域增加:
我们这个地方使用对象实体来填充数据,并且还需要嵌入子模板:
先创建main.jrxml对象实体属性列:
说明一下:
stuNo 类型:java.lang.Integer
stuName 类型:java.lang.String
subjectList 类型:java.util.List
上面两个都好理解,最后一个就是嵌入子模板数据的变量
然后切换到sub1.jrxml文件,我们这个文件仅仅只需要作为一个子表,所以只需要显示学生的科目,老师,分数的Detail内容:
同样的对这三个字段设置实体对象属性:
再切回main.jrxml ,在Detail区域填充我们准备了这么久的实体属性和子模版,填充实体属性使用Text Field,嵌入子模版使用Subreport标签
我们现在来看看Detail板块内容:
前面是学号,姓名,后面是嵌入的子模版
我们还可以对每个学生的各科内容进行平均分的统计:
切回到sub1.jrxml面板,我们定义一个函数:
切回main.jrxml模板,显示sub1.jrxml统计的平均分:
在main.jrxml模板也创建一个函数,用来关联sub1.jrxml模板的平均分函数:
选中Detail中的子模版标签,右侧选择Properties编辑:
ok,到这里基本功能已经实现,列脚,页脚,备注模块以后有时间再补充:
2.4 导出可执行模板
对于Jasper来说,.jrxml文件只是设计文件,就类似于我们Java中的.java,我们需要把它编译成".class",右键.jrxml文件进行编译,生成的.jasper文件就是我们后需要用到的:
3、Jaspersoft 汉化注意事项
大家可能看到上面的标签有警告标志,这可能是这个工具的一个汉化bug,但是不影响使用;
汉化操作:选中所有需要显示中文的标签,在右侧Properties属性编辑中处理如下:
这样我们点击预览,可以正常显示汉字了:
4、引入JasperReports相关依赖
进入JaseprReports开发之前,我们还要处理一个汉化缺陷,官方提供的依赖坐标汉化有问题,但官方也提供了一个补充jar包,需要我们自己打包到maven仓库:
iTextAsian.jar
mvn install:install-file -DgroupId=com.itextasian -DartifactId=itextasian -Dversion=1.0 -Dpackaging=jar -Dfile=iTextAsian.jar
然后pom.xml添加相关依赖:
<!--jasperreports pdf-->
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.17.0</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
<exclusion>
<artifactId>commons-collections</artifactId>
<groupId>commons-collections</groupId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</exclusion>
<exclusion>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports-fonts</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-pdfa</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>2.4.11</version>
</dependency>
<dependency>
<groupId>com.itextasian</groupId>
<artifactId>itextasian</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
5、Jasper报表模板数据填充及PDF下载
业务代码填充非常简单,大家自己看就行,当然不要跟我抬杠为什么不从数据库查询出来,你自己不会吗?
@GetMapping("/exportPdf")
public void exportPdf(HttpServletRequest request, HttpServletResponse response)
throws IOException, BizException {
Resource resource = new ClassPathResource("templates/main.jasper");
/**
* parameters集合中传递的key需要和设计模板中使用的name一致
*/
HashMap parameters = new HashMap();
parameters.put("date","2021-12-01");
List<Map> lst = new LinkedList<>();
HashMap map1 = new HashMap();
map1.put("stuNo",1);
map1.put("stuName","张三");
List<Map> subjectList1 = new LinkedList<>();
HashMap s1 = new HashMap();
s1.put("subjectName","语文");
s1.put("teacherName","赵老师");
s1.put("score",100d);
HashMap s11 = new HashMap();
s11.put("subjectName","数学");
s11.put("teacherName","钱老师");
s11.put("score",90d);
subjectList1.add(s1);
subjectList1.add(s11);
map1.put("subjectList",subjectList1);
HashMap map2 = new HashMap();
map2.put("stuNo",2);
map2.put("stuName","李四");
List<Map> subjectList2 = new LinkedList<>();
HashMap s2 = new HashMap();
s2.put("subjectName","语文");
s2.put("teacherName","赵老师");
s2.put("score",90d);
HashMap s22 = new HashMap();
s22.put("subjectName","数学");
s22.put("teacherName","钱老师");
s22.put("score",90d);
subjectList2.add(s2);
subjectList2.add(s22);
map2.put("subjectList",subjectList2);
HashMap map3 = new HashMap();
map3.put("stuNo",3);
map3.put("stuName","王五");
List<Map> subjectList3 = new LinkedList<>();
HashMap s3 = new HashMap();
s3.put("subjectName","语文");
s3.put("teacherName","赵老师");
s3.put("score",80d);
subjectList3.add(s3);
map3.put("subjectList",subjectList3);
lst.add(map1);
lst.add(map2);
lst.add(map3);
extracted(request, response, resource, parameters, lst);
}
private void extracted(HttpServletRequest request, HttpServletResponse response, Resource resource, HashMap parameters, List<Map> lst) {
JRDataSource dataSource = new JRBeanCollectionDataSource(lst);
try {
File reportFile = resource.getFile();
response.setContentType("application/pdf");
String defaultname = "export.pdf";
String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");
response.setHeader("Content-disposition", "attachment; filename="
+ fileName);
ServletOutputStream ouputStream = response.getOutputStream();
JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,dataSource);
JasperHelper.exportPdf(jasperPrint,"demo", request, response);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
最后看一眼折腾半天的效果: