准备
- jasperreports
- jasperStudio
- idea
基本步骤
- 使用jasperStudio编辑模板
- 软件安装 官方需注册,第三方无需注册
官网下载: https://community.jaspersoft.com/project/jaspersoft-studio/releases
第三方站点: https://sourceforge.net/projects/jasperstudio - 模板制作
- 新建project
file-new -project - 新建 jasperReport
- 模板分多个区域
Title:标题区,如果数据有多页只会在第一页打印
Page Header:页头区,多页的情况下每页都会打印
Column Header:列头区,配合下面的Detail区打印列表数据,多页的情况下每页都会打印
Detail:可以新增多个Detail区,可以组合打印出多个列表数据,多页的情况下每页都会打印
Column Footer:列表底部区,多页的情况下每页都会打印
Page Footer:页底部区,多页的情况下每页都会打印
Summary:合计区,只会在最后一页打印
4)随便设置几个title和feild(直接把元素拖到对应位置,然后在右边的properties里设置属性即可)
5)编译模板
上面保存后的文件是.jrxml格式的,需要编译成.jasper格式。
在jrxml文件上,右键–jasperReports–>compile report 即可。
- 编写java程序
首先使用jasperReport需要先引入他的依赖。
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>6.19.1</version>
<!--jasperReport中依赖了非release版本的itext,阿里镜像库中没有该依赖-->
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
- 将之前生成的jasper文件放在项目中。位置自己定,能访问到即可。
- 我将对jasper的操作写在了工具类中。
在jasperReport中,读取了模板文件。并通过jasperReport的类,做了转换。具体可以详细代码,这里就不赘述了。 - 写一个简单的接口调用就可以测试了
访问 http://localhost:8080/jasper/demo01/getReport?type=pdf 即可看到页面了。
- 碰到问题 这块最值得一看了 因为坑了我好久。
- 依赖的问题。
我jasperreports用的最新的版本。但是这个版本里他依赖了itext.2.1.7.js9这个版本。但是这个版本不是一个release版本,所以阿里的maven库中没有这个。导致构建失败。
处理方式:将jasperreports中默认的依赖去掉,重新加入一个itext的依赖即可。 - 这里需要注意的是,虽然itext的最新版本已经升级成了itextpdf,但这里是不兼容的。jasperreports中只能使用itext的2.1.7.使用itextpdf会报错。
- 中文空白的问题、
在编辑模板后,会碰到中文在浏览器显示为空白的问题。这个需要分两部分处理。
先解释下空白情况。打印时的中文空白有两种:一种是jasperStudio编辑模板时,使用了中文变成了空白。如表头,描述文字等。第二种是java程序里填充的文字变成了空白。如表格的具体内容等。
1)jasperStudio 端的空白
空白的原因是jasperStudio里没有中文字体。虽然字体里可以选择中文的字体,但是实际是没有的。所以需要自己安装需要的中文字体。
右键项目–properties–fonts:
把你.ttf格式的字体文件添加过来就可以了。然后在属性里选择添加的字体文件。
- java程序中的字体空白
项目想增加两个个配置文件:
1)jasperreports_extension.properties
xst是自己命名的,取啥都行。后面的文件路径是你字体文件的存放路径。
net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.xst=fonts/fonts.xml
2)fonts.xml
<fontFamily name="新宋体常规"><!--字体名称-->
<normal>fonts/新宋体常规.ttf</normal><!--字体文件的路径-->
<bold>fonts/新宋体常规.ttf</bold>
<italic>fonts/新宋体常规.ttf</italic>
<boldItalic>fonts/新宋体常规.ttf</boldItalic>
<pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
<pdfEmbedded>true</pdfEmbedded>
<exportFonts>
<export key="net.sf.jasperreports.html">'新宋体常规', Arial, Helvetica, sans-serif</export>
<export key="net.sf.jasperreports.xhtml">'新宋体常规', Arial, Helvetica, sans-serif</export>
</exportFonts>
</fontFamily>
然后就可以了
java端你可以把jasperStudio 里导入的字体文件,导出为jar包,然后add进项目中,就不用这个配置文件了。
ppppss:
如果你上述设置后,还是有问题,检查下jasperStudio 中设置java填充内容的占位元素的font,有没有设置为对应的中文字体。这里不设置的话,java中设置是不生效的。一定注意!
代码的demo完整文件地址:
https://github.com/PQfushb/jasperReport