知方号 知方号

Jasper实现报表(Java) java生成报表工具

Jasper实现报表(Java)

目录

1、TIBCO Jaspersoft Studio安装

2、Jaspersoft Studio使用

2.1 创建一个JasperReports Project

2.2 创建报表模板

2.3 设计报表模板

2.4 导出可执行模板

3、Jaspersoft 汉化注意事项

4、引入JasperReports相关依赖

5、Jasper报表模板数据填充及PDF下载

1、TIBCO Jaspersoft Studio安装

下载地址:Jaspersoft® Studio | Jaspersoft Community

需要JDK环境并且尽量6.0以上,6.0以下兼容性和汉化支持麻烦(这句基本上是废话了),我这里是安装的社(白)区(嫖)版,Jaspersoft Studio这个工具其实跟Eclipse长得非常像,可以单独安装,也可以Eclipse插件方式安装,甚至可以当成Eclipse工具使用.....

安装完成后看看靓照,是不是很Eclipse?

2、Jaspersoft Studio使用 2.1 创建一个JasperReports Project

工具会帮我们自动加载报表开发锁需要的依赖包

2.2 创建报表模板

我们的目标效果是设计一个包含主从表的学生成绩统计报表

下面我们开始表演:

1、首先我们先创建一个空白页主模板,操作还是很Eclipse

模板每个部分都解释一下,看下图

同样的方式创建一个子模版,因为一个主模板一般会对应多个子模版,所以我们弄个包包起来,备用:

2.3 设计报表模板

1、main.jrxml 文件Title板块添加标题,标题我使用标签,拖过去对齐成你喜欢的姿势,并且可以对字体“加大加粗”哦:

2、main.jrxml 文件 Page Header 板块加一个日志信息,使用动态标签

创建一个Parameters变量

3、main.jrxml 文件 Column Header增加列头显示,这里使用静态标签就行

4、Detail模块加上需要展示的内容,这个地方是重中之重,唯独只有Detail模块可以有多个,可以右键点击Detail区域增加:

我们这个地方使用对象实体来填充数据,并且还需要嵌入子模板:

先创建main.jrxml对象实体属性列:

说明一下:

stuNo 类型:java.lang.Integer

stuName 类型:java.lang.String

subjectList 类型:java.util.List

上面两个都好理解,最后一个就是嵌入子模板数据的变量

然后切换到sub1.jrxml文件,我们这个文件仅仅只需要作为一个子表,所以只需要显示学生的科目,老师,分数的Detail内容:

同样的对这三个字段设置实体对象属性:

再切回main.jrxml ,在Detail区域填充我们准备了这么久的实体属性和子模版,填充实体属性使用Text Field,嵌入子模版使用Subreport标签

我们现在来看看Detail板块内容:

前面是学号,姓名,后面是嵌入的子模版

我们还可以对每个学生的各科内容进行平均分的统计:

切回到sub1.jrxml面板,我们定义一个函数:

切回main.jrxml模板,显示sub1.jrxml统计的平均分:

在main.jrxml模板也创建一个函数,用来关联sub1.jrxml模板的平均分函数:

选中Detail中的子模版标签,右侧选择Properties编辑:

ok,到这里基本功能已经实现,列脚,页脚,备注模块以后有时间再补充:

2.4 导出可执行模板

对于Jasper来说,.jrxml文件只是设计文件,就类似于我们Java中的.java,我们需要把它编译成".class",右键.jrxml文件进行编译,生成的.jasper文件就是我们后需要用到的:

3、Jaspersoft 汉化注意事项

大家可能看到上面的标签有警告标志,这可能是这个工具的一个汉化bug,但是不影响使用;

汉化操作:选中所有需要显示中文的标签,在右侧Properties属性编辑中处理如下:

这样我们点击预览,可以正常显示汉字了:

4、引入JasperReports相关依赖

进入JaseprReports开发之前,我们还要处理一个汉化缺陷,官方提供的依赖坐标汉化有问题,但官方也提供了一个补充jar包,需要我们自己打包到maven仓库:

iTextAsian.jar

mvn install:install-file -DgroupId=com.itextasian -DartifactId=itextasian -Dversion=1.0 -Dpackaging=jar -Dfile=iTextAsian.jar

然后pom.xml添加相关依赖:

                    net.sf.jasperreports            jasperreports            6.17.0                                                com.lowagie                    itext                                                    commons-logging                    commons-logging                                                    org.apache.commons                    commons-lang3                                                    commons-collections                    commons-collections                                                    com.fasterxml.jackson.core                    jackson-databind                                                    com.fasterxml.jackson.core                    jackson-annotations                                                    org.apache.commons                    commons-collections4                                                    commons-beanutils                    commons-beanutils                                                        com.lowagie            itext            2.1.7                            net.sf.jasperreports            jasperreports-fonts            6.0.0                            com.itextpdf            itext-pdfa            5.5.0                            org.codehaus.groovy            groovy-all            2.4.11                            com.itextasian            itextasian            1.0                            org.apache.commons            commons-collections4            4.4                            commons-beanutils            commons-beanutils            1.9.4       

5、Jasper报表模板数据填充及PDF下载

业务代码填充非常简单,大家自己看就行,当然不要跟我抬杠为什么不从数据库查询出来,你自己不会吗?

@GetMapping("/exportPdf")    public void exportPdf(HttpServletRequest request, HttpServletResponse response)            throws IOException, BizException {        Resource resource = new ClassPathResource("templates/main.jasper");        /**         * parameters集合中传递的key需要和设计模板中使用的name一致         */        HashMap parameters = new HashMap();        parameters.put("date","2023-12-01");        List lst = new LinkedList();        HashMap map1 = new HashMap();        map1.put("stuNo",1);        map1.put("stuName","张三");        List subjectList1 = new LinkedList();        HashMap s1 = new HashMap();        s1.put("subjectName","语文");        s1.put("teacherName","赵老师");        s1.put("score",100d);        HashMap s11 = new HashMap();        s11.put("subjectName","数学");        s11.put("teacherName","钱老师");        s11.put("score",90d);        subjectList1.add(s1);        subjectList1.add(s11);        map1.put("subjectList",subjectList1);        HashMap map2 = new HashMap();        map2.put("stuNo",2);        map2.put("stuName","李四");        List subjectList2 = new LinkedList();        HashMap s2 = new HashMap();        s2.put("subjectName","语文");        s2.put("teacherName","赵老师");        s2.put("score",90d);        HashMap s22 = new HashMap();        s22.put("subjectName","数学");        s22.put("teacherName","钱老师");        s22.put("score",90d);        subjectList2.add(s2);        subjectList2.add(s22);        map2.put("subjectList",subjectList2);        HashMap map3 = new HashMap();        map3.put("stuNo",3);        map3.put("stuName","王五");        List subjectList3 = new LinkedList();        HashMap s3 = new HashMap();        s3.put("subjectName","语文");        s3.put("teacherName","赵老师");        s3.put("score",80d);        subjectList3.add(s3);        map3.put("subjectList",subjectList3);        lst.add(map1);        lst.add(map2);        lst.add(map3);        extracted(request, response, resource, parameters, lst);    }    private void extracted(HttpServletRequest request, HttpServletResponse response, Resource resource, HashMap parameters, List lst) {        JRDataSource dataSource = new JRBeanCollectionDataSource(lst);        try {            File reportFile = resource.getFile();            response.setContentType("application/pdf");            String defaultname = "export.pdf";            String fileName = new String(defaultname.getBytes("GBK"), "ISO8859_1");            response.setHeader("Content-disposition", "attachment; filename="                    + fileName);            ServletOutputStream ouputStream = response.getOutputStream();            JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile);            JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters,dataSource);            JasperHelper.exportPdf(jasperPrint,"demo", request, response);            ouputStream.flush();            ouputStream.close();        } catch (Exception e) {            e.printStackTrace();        }    }

最后看一眼折腾半天的效果:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了