1.生成pdf文件用到的工具:JasperSoft studio。可到官网下载Jaspersoft® Studio | Jaspersoft Community
下载对应版本。
2.打开开发工具新建自己的模板,一个新建的模板有几个分区,需要注意.
title:标题,只在第一页显示
page healder:这个每页显示的部分,
column healder:列明,做报表的话这个和detail结合使用
detail:循环的部分,
column footer:统计此列数据
page footer:底部显示,可以用来显示分页
summary:统计值,只在最后一页显示
其实这些部分有些我没用到,在我的开发中,我是用的是父子模板,只用到了titel、page healder、column healder、detail、page footer,这些部分。
然后,考虑到字体的问题,需要将字体信息放入放入的工程中,这个百度搜索一大把,可以将自己喜欢的字体导入工程。
3.然后就开始制作模板,根据需求我的模板几个常用到的element :text field、static field、subreport、chart,这些。
然后说一下
这个分区,style 可以设置样式,包括边框颜色和背景颜色等 , parameters 是java程序传进来的一个Map,Fields是List,其他部分选择自己用到的。detail是用到最多的,用来循环数据。
在text field引入参数时,有三个 $P $F $V ,这三个区别
$P可以说是parameters中的数据引入
$F是fields中的数据
$V是统计数据,显示页面可以用$V
遇到的一些问题:
1、页面显示,用到了Page Footer,这个在每页的底部显示,然后页数在Variables中就有,叫PAGE_NUMBER, 我显示的是 第几页,共几页,用到的都是PAGE_NUMBER,但是得设置一下。
第几页这个设置为Now,共几页的设置是Report。
2、在设置Text Field的时候字体颜色包括高亮显示这些该怎么设置。
Text Field 有一个Markup属性,选择html,传的参数就可以是一段html代码,这样就可以自定义设置字体颜色包括其他一些属性。
3、引入字表Subreport,传参怎么传
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{metriccompares})
这是我的一个示例,向字表传参,引入设置是Expression,一个路径加jasper文件。
多级字表的形式一样,只不过list嵌套list而已。
4、字表我既想传list,也想传map。
我的字表是一个表格,表头的标题是需要修改的,这时候我不能再list的数据都加入表头,这样很麻烦,我就想可不可以既传list,也传map;
subreport设置
这两个就是,我把Parameters中的数据也传过去,字表接受是map中的Key。
5、还有一个很蠢的问题,我detail中的数据如何让他的高度自适应,这个我想了半天,也查了半天,都没结果,后面我一想,detail可以有多个,我多创建几个不就好了。-_-||
6、Text Field设置锚点和超链接
超链接的设置
target修改为blank,下面的reference Expression设置你的跳转地址。
锚点的话
target修改俄日self,type设置localAnchor,Anchor Expression设置你Text Field自己设置的Anchor Name就可以实现跳转。
说完这些问题,模板差不多设置好了,在java端怎么操作。
首先在resource下新建目录,jasper ,用来放模板,然后就可以写pdf下载业务了,当然jasper 的包是要引的
<dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.17.0</version> <exclusions> <exclusion> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency>
写完下载,本地运行可以下载,但是打成jar包以后报路径错误,这个问题我传入的是classpath,相对路径,打成jar包后找不到,这时候换成InputStream就可以操作了。