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添加相关依赖:

<!--jasperreports pdf-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
            <exclusions>
                <exclusion>
                    <groupId>com.lowagie</groupId>
                    <artifactId>itext</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-lang3</artifactId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-collections</artifactId>
                    <groupId>commons-collections</groupId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-databind</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.fasterxml.jackson.core</groupId>
                    <artifactId>jackson-annotations</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-collections4</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>commons-beanutils</groupId>
                    <artifactId>commons-beanutils</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-pdfa</artifactId>
            <version>5.5.0</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.11</version>
        </dependency>

        <dependency>
            <groupId>com.itextasian</groupId>
            <artifactId>itextasian</artifactId>
            <version>1.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-collections4</artifactId>
            <version>4.4</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.4</version>
        </dependency>




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","2021-12-01");
        List<Map> lst = new LinkedList<>();
        HashMap map1 = new HashMap();
        map1.put("stuNo",1);
        map1.put("stuName","张三");
        List<Map> 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<Map> 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<Map> 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<Map> 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();
        }
    }

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

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值