ireport打印PDF报表(数据源java bean、List)

1 篇文章 0 订阅
1 篇文章 0 订阅

最近有个需求,做一个类似如下的报表,打印pdf版。下面的是excel模板,采用的是传统的方式,替换参数,出现的问题有换行和翻页显示不全。所以准备使用ireport工具画一个模板。

 使用工具:JasperSoft studio,因为ireport 只支持jdk1.7及以下的。现在生产环境大部分都是1.8+,所以查询一些资料,发现现在他的升级产品就是jaspersoft .这个工具界面类似eclipse,基本操作这里不做介绍,只说一些常见问题,下面是我画的模板

上面大的表头是一些零碎的参数,下面的是一些子报表,里面的数据是动态的。 

1:因为我的数据是后端传过来的,所以这个模板我结合提供接口参数(list),准备将这个表的数据自定义一个实体,类似下面

 零碎参数用map,子报表数据用list(类型是util.List)(模板定义字段要跟后端保持一致,字段名称首字母不要大写。会出现问题)

参数放在parameters里面,list放在Fields里面,如下:

2:后端核心代码

 List<ReimbursePdfVo> mainList = new ArrayList<ReimbursePdfVo>();
            ReimbursePdfVo pdfVo = new ReimbursePdfVo();
           
            //map作为报表数据源
            Map<String, Object> parameters = new HashMap<String, Object>();
            //。。。零碎数据封装

//list数据封装 
 //差旅费用报销诚信承诺
                if (company.isReimburseSubsidyPromise()) {
                    Staff staff = staffRepository.findByStaffId(reimburse.getStaffId());
                    List<ReimburseSubsidyPromise> reimburseSubsidyPromises = reimburseSubsidyPromiseRepository.findAllByReimburseId(reimburse.getReimburseId());
                    if (reimburseSubsidyPromises != null && reimburseSubsidyPromises.size() > 0) {
                        List<ClfbxcxcnVo> ClfbxcxcnVoList = new ArrayList<>();
                        reimburseSubsidyPromises.forEach(reimburseSubsidyPromise -> {
                            ClfbxcxcnVo clfbxcxcnVo = new ClfbxcxcnVo();
                            clfbxcxcnVo.setStaffUserName(staff.getStaffUserName());
                            clfbxcxcnVo.setStaffType(StaffTypeNumber.setValue(staff.getStaffType()));
                            clfbxcxcnVo.setFromTime(reimburseSubsidyPromise.getStartDate());//------开始时间
                            clfbxcxcnVo.setEndTime(reimburseSubsidyPromise.getEndDate());//--------结束时间
                            clfbxcxcnVo.setOfferCarStr(reimburseSubsidyPromise.getOfferCar() ? "是" : "否");
                            clfbxcxcnVo.setOfferMealStr(reimburseSubsidyPromise.getOfferMeal() ? "是" : "否");
                            clfbxcxcnVo.setOfferHotelStr(reimburseSubsidyPromise.getOfferAccommodation() ? "是" : "否");
                            ClfbxcxcnVoList.add(clfbxcxcnVo);
                        });
                        pdfVo.setClfbxcxcnList(ClfbxcxcnVoList);
                    }
                }


 mainList.add(pdfVo);

 String mainjrxmlPath = DocumentPrintComponent.class.getResource("/template/jrxml/burise_main_test.jrxml").getPath();
            String burise_sub_grzf_Path = DocumentPrintComponent.class.getResource("/template/jrxml/burise_sub_grzf.jrxml").getPath();//个人支付
            String burise_sub_dgzf_Path = DocumentPrintComponent.class.getResource("/template/jrxml/burise_sub_dgzf.jrxml").getPath();//对公支付
            String burise_sub_csjjt_Path = DocumentPrintComponent.class.getResource("/template/jrxml/burise_sub_csjjt.jrxml").getPath();//城市间交通


            String mainjasperPath = DocumentPrintComponent.class.getResource("/template/jasper/burise_main_test.jasper").getPath();
            String jasper_burise_sub_grzf_Path = DocumentPrintComponent.class.getResource("/template/jasper/burise_sub_grzf.jasper").getPath();//个人支付
            String jasper_burise_sub_dgzf_Path = DocumentPrintComponent.class.getResource("/template/jasper/burise_sub_dgzf.jasper").getPath();//对公支付
            String jasper_burise_sub_csjjt_Path = DocumentPrintComponent.class.getResource("/template/jasper/burise_sub_csjjt.jasper").getPath();//城市间交通

 //编译jrxml生产jasper文件
            JasperCompileManager.compileReportToFile(mainjrxmlPath, mainjasperPath);
            JasperCompileManager.compileReportToFile(burise_sub_grzf_Path, jasper_burise_sub_grzf_Path);//个人支付
            JasperCompileManager.compileReportToFile(burise_sub_dgzf_Path, jasper_burise_sub_dgzf_Path);//对公支付
            JasperCompileManager.compileReportToFile(burise_sub_csjjt_Path, jasper_burise_sub_csjjt_Path);//城市间交通
            JasperPrint jasperPrint = JasperFillManager.fillReport(mainjasperPath, parameters, new JRBeanCollectionDataSource(mainList));
//            JasperExportManager.exportReportToPdfFile(jasperPrint, "D:/HTML/burisePrint(" + reimburse.getReimburseId() + ").pdf");   //生成本地pdf
            byte[] by = JasperExportManager.exportReportToPdf(jasperPrint);
            return by;

代码可以导出pdf文件(注释处 是导出pdf文件),也可以以流的形式返回。可以根据自己的情况使用。

打印效果如下:

其中遇到的一些问题:

1:因为需求模板(excel)上下面子表的数据都是动态的,可能多行,起初只知道把数据放在detail里面他就能动态遍历,但是我有多个子表,只能让数据动态遍历,表头合计什么的不能循环。(查询资料,使用subreport子报表可以实现,子报表里面相当于是一个新的模板,我只保留需要的属性,比如title, column header,detail,summary,foot page),将子报表里面懂得数据放在detail,不需要循环的放外面,如果有合计功能,最好放在summary里面,我起初是在coulmn header还是title里面 写的表达式,但是出现的问题是只能合计当前页面的,如果翻页之后,就不会合计后面数据。

2:中文问题,默认的jar是不支持中文的,我是自己打的jar添加到项目和工具的,这个网上有很多方法,目前尝试成功的字体是华文宋体(STSONG.TTF),自己后期尝试以同样的方式添加微软雅黑,但是没有成功,可能是工具问题bug,也可能是缓存吧。

3:换行问题,因为我的这个表格是我用static text和text field拼成的,所以,可能某一列换行的时候,别的列不会换行然后会有对不齐的现象。首先某个各自换行的属性设置是:Stretch with Overflow,需要勾上。想要同行的每一个各自同高度的话,需要设置每个格子的属性stretch type:relatice to band height。如下

4:翻页每页留白的问题, 如下:(我这个是已经调整过的,初期可能会有很大的空白),自己也不清楚,明明已经设置过翻页了,也确实生效了,但是为什么还会留有那么大的,自己尝试着又添加了几条数据,他就排在下面了,那为什么在他还有区域可以排列的时候,没有将第二页的表头排上来呢。

我的解决方法是,我觉得是模板设计的问题,每个子报表的margin  上下左右我都设置0了,所以如果排列的话,每个字表肯定是紧密拼在一起的,那么问题可能是主模板的,我的大模板是如文章上面第一张图的,我想到的不确定因素是主模板在设置每一个子模板的detail band的高度,应该给多少合适,每一个子报表的高度我是不确定的,因为他的数据是动态遍历的 ,这个外层的detail band应该给多少合适,问了一些技术群也没人能回答上,网上也没有想要的答案,自己尝试的做法是,我给每一个detail band一个最小值,也就是subreport里面 已知固定的高度,比如title 和column header的高度。下面detail的 不知道先不管,外层的高度就设置成这两个高度之和。这样主模板的排列我想应该会尽可能“更”紧凑了,因为假如子模板的内容没有撑满外层detail band的高度,剩余的内容区域会以空白填充。就这

5:精度 (千分位,保留两位小数)

这个就是看这个工具的熟练度,可能知道肯定支持但是不好找,在下面位置:

6:合计功能 (使用表达式)     操作如下:其他的设置按照默认的

 

7: 待续。。。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hidetou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值