# JasperResport 报表系统
## JasperReport 基础概念:
1. jrxml文件: 该文件定义了一个报表的基础布局,布局预览如下:
![](https://img.kancloud.cn/9b/e3/9be3fc6a1d9fe7bceffe975931bc9d17_598x490.png)
**报表标题区**:相当于整个报告的标题,在整个文档中只出现一次
**当前页头/脚**:相当于word中的页头页脚
**列头/脚**:表格中的列头和列脚
**汇总区**: 出现在整个文档的结尾,用于汇总合计
**Background**: 用于设置报表水印
**Detail区**: Japser 会遍历设置的数据源中的每条数据,显示相应字段的值。
不同的区域对应xml源文件中的不同节点,默认报表中有如下节点:
![](https://img.kancloud.cn/58/59/5859aa13a346a4f8126d3dcd8bc7304d_256x366.png)
每一个报表都有一个默认的主数据源和多个子数据源、多个参数、
多个变量:
2. 报表组件: Jasper提供了许多有用的组件来包裹不同的内容:
![](https://img.kancloud.cn/0b/32/0b32a538d2587000ecf8cea5c5ccc448_359x333.png)
3. Springboot集成Jasper:
a. 添加依赖 解决中文字体问题
![](https://img.kancloud.cn/1e/10/1e1004d64e40b27941b48ecfdfdc6286_696x261.png)
第二个依赖是Japser要使用的字体。由于字体版权问题,这个包中包含的字体有限,
如果使用中文,就会出错,这时候就需要通过接口添加字体文件。
首先在 C://windows/font 文件夹里找到相关的字体文件 (*.ttf格式) 放到 resources下面新建文件夹 jasper/font 中(可以自定义),再添加font.xml 内容如下:
```
~~~
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="msyh">
<normal>jasper/font/msyh.ttf</normal>
<bold>jasper/font/msyh.ttf</bold>
<italic>jasper/font/msyh.ttf</italic>
<boldItalic>jasper/font/msyh.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'msyh', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'msyh', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
</fontFamilies>
~~~
```
注意这里给字体命名为 msyh ,这个命名要跟 jasper studio中的字体名字一样。
然后新建配置文件`jasperreports_extension.properties`内容如下: 要注意这里配置的路径要与实际目录一致!
```
~~~
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.msyh=jasper/font/fonts.xml
~~~
```
项目代码里配置完成后,需要在jasper studio中也安装相关的字体,定义要注意这里的字体名字要去上面的一致! 点击 windonws-> prefrence 搜索font即可。如下图
![](https://img.kancloud.cn/06/18/0618cafc2d7a4f95d26c9289b3687179_730x393.png)
b. 向报表模板传递值:
这里的操作跟MVC非常相似! 但是也非常简单:关键代码如下
![](https://img.kancloud.cn/0b/3d/0b3d3a036dc12460b667e976a81e96df_1049x560.png)
两个关键函数:一个重要概念:
~~~
JasperCompileManager.compileReport () 用于编译Jrxml模板
~~~
~~~
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JRBeanCollectionDataSource(tableMergeCols)); 用于向模板传递参数和数据源!
一个模板只能有一个主数据源,但是可以有多个参数:子报表也是一种参数,子数据源也是一种参数
~~~
最终报表效果如下:
![](https://img.kancloud.cn/c3/0c/c30cc95014c5349bbe561ecab4dd3464_794x691.png)