引言:之前一直没有记录的习惯,所以在这里记录有些是回忆,所以可能有些不连贯.而且本人的问题不一定是你的问题,仅作参考.
(注:本人是使用java生成pdf文件)
1.介绍(只介绍自己用的到)
进入软件 File->new->jasper report->blank A4
我们得到了一张A4纸,如下图所示.(注:该jasperreport被我使用过所以area 4只有title,刚创建时不止这一个但不影响使用. 还有界面布局我拖动过正常project explorer好像是在左上角.)
area 1:
A4纸,我们想要的功能就在这上面添加
area 2:
(常用的一些element,可以通过拖拽的方式添加到area 1和 area 4)
Text Feild: 变量,通过代码传参获得
Static Text: 静态文本,通常是写死的内容
Image: 在pdf上显示一张图片
Line: 加上一条线(个人感觉很麻烦,还不美观,不如使用边框)
Frame:一个框架,可以理解为可有可无的容器
Subreport:子报表.(有两个需要遍历的列表,例:列出一个人的所有房子和车子,具体看需求,不需要杠)
BarCode: 条形码和二维码
area 3:
(系统变量element,可以通过拖拽的方式添加到area 1和 area 4. 通俗点就是也是变量但是不需要你传值,他自己回传,比如页码之类的)
Page Number: 页码或总页数,根据area 5的Text Field->Evaluation Time区分(now为当前页,report是总页数)
Page x of y: x为当前页,y为总页数
area 4:
parameter:我们传的参数(HashMap传递)
Fields:列表参数,特点是重复遍历的列表数据
variables:变量
一张A4纸功能划分区域.
Title:标题只显示一次
Page Header:页头每页都有
Column Header:列头,每页都有
Detail:通常我们列表打印的地方
Column Footer:列脚,应该同列头一样
Page Footer:页脚,每页都有
Last Page Footer:最后一页的页脚(会不会替换页脚我忘了,当时试过,最后没用所以没啥印象)
Summary:总结,最后一页出现
<Notice:如果你的需求特别的简单且一页就可以弄完,你甚至可以忽略上述的区域,只用一个区域完成>
area 5:
area 4里面的元素的属性,在这里我们可以尽情的玩弄它们,让它们欲罢不能.
这里常见的一些功能分别是(容易通过界面理解的和我没用到不涉及):
Appearance:外观
Transparent:不勾选可以选择自己的颜色
removeLineWhenBlank: 当你的数据为null时不想占空间可以选择二(实际效果自己试下,因为我是回想的的当时没记,详情了解看下文问题记录)
print when expression:满足它就会显示
Edit Properties: 一些自带的逻辑处理功能选择
(这里我用到了markup<用这个标记为html格式来写html代码,因为它传String类型空格是去掉的,用html写就不会,具体看问题记录>,
和printBlankwhennull<null时打印为空,这串英文没错>)
Borders:边框
值得一提的是这里可以点(刚开始我都是去source里改的...)
Text Field:文字的一些属性
略.
Inheritance:可以调一下样式之类的,可以忽略.
area 6:
Design:compile report时会输出一些log,有时可以看到一些报错
source:文件源码,可以进去需改一些你想修改的东西,也可以看到一些错误提示(在边框上红色区域就是)
preview:预览你的文件(这个预览跟你生成的可能会有些偏差,不知道时jar版本区别还是啥)
使用1
1.java部分(我使用的绝对路径为测试用写的,在项目上使用resource相对路径去读取)
依赖<dependency><groupId>net.sf.jasperreports</groupId><artifactId>jasperreports</artifactId><version>6.17.0</version> </dependency>
jar大概的用到的代码
1 //这个是用到的一些代码 2 public void test() throws Exception { 3 try (InputStream HgcSummaryZ = new FileInputStream("D:\\work\\zhu\\testSpring\\src\\main\\resources\\statementListPage.jasper"); 4 InputStream img = new FileInputStream("D:\\work\\zhu\\testSpring\\src\\main\\resources\\myImg.png") 5 ) { 6 HashMap<String, Object> parameter = new HashMap<>(); 7 parameter.put("img",img); 8 parameter.put("name","Handsome Boy "); 9 ArrayList<StatementBean> statementBeans = new ArrayList<>(); 10 11 HashMap<Object, Object> objectObjectHashMap = new HashMap<>(); 12 parameter.put("dataList", statementBeans); 13 parameter.put("dataMap", objectObjectHashMap); 14 parameter.put("reportPath", "D:\\work\\zhu\\testSpring\\src\\main\\resources\\statementListSub.jasper"); 15 16 // new JRBeanCollectionDataSource(statementBeans); 17 JasperPrint jasperPrint = JasperFillManager.fillReport(HgcSummaryZ, parameter, new JREmptyDataSource()); 18 JasperExportManager.exportReportToPdfFile(jasperPrint,"myPdf".pdf"); 19 } 20 } 21 22 23 //这个是多个jasper文件生成的pdf页面合成一个的代码,注意是两个jasper文件合并才用的上 24 JasperPrint jasperPrint = testStatementPage(false); 25 JasperPrint jasperPrint3 = pdfPaymentAdjustment(false); 26 for (JRPrintPage page : jasperPrint3.getPages()) { 27 jasperPrint.addPage(page); 28 } 29 JasperExportManager.exportReportToPdfFile(jasperPrint, "HgcJasperTestFile.pdf");
下面做一下解析(只做test方法里的解析)
这是两个关键的方法
JasperPrint jasperPrint = JasperFillManager.fillReport(HgcSummaryZ, parameter, new JREmptyDataSource());
第一个参数(HgcSummaryZ):文件流;
第二个参数(parameter):对应area 4里的parameters参数
第三个参数(new JREmptyDataSource():这个是没有列表数据传的,new JRBeanCollectionDataSource(statementBeans):这个是参数列表):对应area 4里的fields参数
JasperExportManager.exportReportToPdfFile(jasperPrint,"myPdf.pdf");
第一个参数(jasperPrint):jasperPrint;
第二个参数("myPdf.pdf"):是你的路径加上/path/fileName
至此我们java部分的code已经全部解析完毕.
2.jasper部分
开始我们的demo,ready go~.(只使用其中一部分作为案例)
创建parameters(类型要和hashmap的数据一致)和feild(类型要和实体类一致):
拖动刚创建的parameter和field到area 1或area 4中得到.
成果(第一张图为之前的成品仅作参考,图二为修改后的文件,java使用的也是它):
图一
图二
java生成得到(颜色修改请忽略,还有就是duration那行其实放了两个Field):
使用2:该部分为suubreport使用(javaCode一致.).
使用的起源:一个页面想打印两个完整的列表(完整的意思:有自己的列头,自己的summaryd等)
jasper文件图:
效果图:略
java解析
HashMap<Object, Object> objectObjectHashMap = new HashMap<>();
//dalist,datamap,reportPath每一个subreport都会有设置,这里我忽略了第二个subreport的parameter parameter.put("dataList", statementBeans);//subreport的list parameter.put("dataMap", objectObjectHashMap);//subreportd的parameter
parameter.put("reportPath", "D:\\work\\zhu\\testSpring\\src\\main\\resources\\statementListSub.jasper");//jasper文件路径
new JRBeanCollectionDataSource(statementBeans);
JasperPrint jasperPrint = JasperFillManager.fillReport(HgcSummaryZ, parameter, new JREmptyDataSource());
jasper里长这个样
其中Data Source Expression完整为:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{serviceDataList})
其中subreport的大小,我一般设为一行列表数据的宽度和高度.
3.自定义变量(不常用,了解)
page为当前页数据,report是整个文件的数据
问题记录(*部分属灵异事件)及技巧:
1.页数问题:因为我的pdf文件是由多个jasper拼接而成所以无法单纯的使用自带的page x of y来解决页码问题.
解决:通过页面最大列表容量来得出页数,再后续的页面中通过parameter来写页数
2.*编译问题:在本机的页面中放最大容量数据只会出现一页; dev环境会出现两页,第二页列表数据为空.
解决:通过勾选report 的properties中Ignore Pagination解决(area 5),并填数据时控制数据数量
(注:这个选项超过最大容量数据时会扩张纸张的长度,使纸张不再是a4纸)
3.列脚位置异常问题
解决:通过勾选report 的properties中Float Column Footer解决(area 5)
4.*列头下出现空隙(某个页面,不是全部. 不一定会出现.)
解决:表头用frame框起来
5.右对齐的情况下想要加点空格,但是空格会被自动去掉(为什么会加空格,因为没加空格的数据后面加了其他所以无法对齐)
解决:在area 5中的edit properties中markup填为html,然后在java传参时添加`<pre>`包裹
"<pre>" +yourParameter+" "+"</pre>"
6.null会出现在表格里
解决:在area 5中的edit properties中printBlankwhennull选择true
7.文本有序列表无法对齐问题:markup填为html,写有序列表时,perview是理想效果,java生成不是.
解决:暂时无法解决.
8.列脚,页脚,总结同时出现时页面布局异常.
解决:软件设计缺陷无法解决,通过用其他band尝试.
9.列表数据高度固定问题:目前的页面是列表数据多少决定页面最下面除去页脚空白的高度; 想要的效果是数据少是空白在中间而不是在下面.
解决:用子报表解决subreport放在Frame外面,这里的frame主要是画一个边框. 放里面记得会出现问题,他会看作一个整体啥的.
然后把band的宽度拉满,然后就固定了占用页面大小了.
我这里detail高度,subreport页面大小及在detail里的高度,frame高度都是设为最大的428.
10.没有明显的异常,就是JAVA写文件的时候出现异常.显示一串英文(类似<忘记记录了所以靠记忆>:ED FG HJ...)
解决:文件异常可能是你的编辑有写非法但是编译没问题真正去java操作才有问题,请回退到上个版本再编辑.
11.如果使用jasperreport出现运行慢,及编译失败和保存失败等;
解决:save all不行就一个个保存,然后重启软件.
万道归一,触类旁通,如是而已.
个人感悟:20毕业这些年一直划水,不爱学习,导致23年脑残辞职后没找到工作,兜兜转转从23年的14.5k掉到5.5k.应了那句话"书到用时方恨少",也算是百因必有果吧.望以后努力学习,找份好工作,诸君共勉.