【JasperReports笔记01】Jasper Studio报表开发工具的安装以及使用Java填充模板文件内容

news2024/12/27 2:03:29

这篇文章,主要介绍如何安装Jasper Studio报表开发工具以及使用Java填充模板文件内容。

目录

一、安装Jasper Studio工具

1.1、下载报表开发工具

1.2、工具界面介绍

(1)启动工具

(2)创建项目

二、制作Jasper模板文件

2.1、Jasper文件组成区域介绍

2.2、制作模板文件

三、使用Java填充数据

3.1、引入依赖

3.2、创建JasperReportsUtil工具类

3.3、测试控制器类

3.4、放置Jasper模板文件

3.5、运行测试


一、安装Jasper Studio工具

1.1、下载报表开发工具

JasperReport提供了一个专门用于制作报表模板文件的开发工具,叫做:Jasper Studio,官方下载地址是:https://community.jaspersoft.com/community-download,进入下载界面,如下所示:

点击下载按钮,此时会弹出提示框,点击继续就会跳转到下载详情界面:https://community.jaspersoft.com/project/jaspersoft-studio/releases,如下所示:

在下载详情界面中,可以有多种格式的下载文件,例如:exe、zip、tgz等,这里我选择了zip文件,点击下载就可以啦。需要注意的是下载时候,会提示让你注册JasperReports的社区账号,我们用自己邮箱注册一个就可以啦。将下载完成的zip压缩包解压到你的工作目录下,解压之后,会得到一个jaspersoftstudio目录,如下所示:

这个目录下有一个Jaspersoft Studio.exe文件,双击这个文件就可以启动 JasperReports 报表工具啦。

1.2、工具界面介绍

(1)启动工具

双击Jaspersoft Studio.exe文件,启动JasperReports报表工具,如下图所示:

上图就是启动之后的欢迎界面,看着有点像eclipse开发工具对吧!没错,Jasper Studio就是基于Eclipse进行开发的,它可以单独使用,也可以作为Eclipse的插件添加到Eclipse开发工具中使用。

(2)创建项目

左上角选择【File-->New-->Jasper Report】创建一个报表项目,如下所示:

在弹出框中,选择自己需要的模板文件就可以啦,一般来说都是选择A4空白模板,或者是水平方向的A4空白模板,剩下的就是自己设计模板文件啦。

输入项目名称,选择数据源之类的,这里可以省略,直接傻瓜式的点击next就行啦,最后点击Finish即可。

项目创建成功之后,此时就会进入到Jasper Studio的工作区域,Jasper工作区域大致分为下面这几个部分:

到这里,Jasper Studio工具安装好了,并且基本的工作区域也知道了,那就可以开始制作自己的模板文件啦。

二、制作Jasper模板文件

2.1、Jasper文件组成区域介绍

可以看到在Jasper Studio的主报表区域有很多的组成部分,如下图所示:

Jasper将模板文件划分为上面几个组成部分,每一个组成部分表示的含义不同,其中每一个部分的作用如下所示:

  • Title区域:这个区域只会在模板文件的第一页中显示,从第二页开始就不会显示,主要定义文件的标题内容。
  • Page Header区域:这个区域是从第二页开始,每一页都会显示的页头信息,显示在每一页的最顶部。
  • Column Header区域:当我们使用了Table组件的时候,Column Header区域才会生效,它表示的表格的列头,会在每一页显示。
  • Detail区域:这个区域就是真正显示内容的区域,可以有多个Detail区域。
  • Column Footer区域:当我们使用了Table组件的时候,Column Footer区域才会生效,它表示的表格的列尾,会在每一页显示。
  • Page Footer区域:这个区域是从第二页开始,每一页都会显示的页脚信息,显示在每一页的最底部。
  • Summary区域:这个区域是表示合计区域,只会显示在最后一页的末尾区域。

现在不知道这些东西不要紧,后面的文章中,我会通过制作一些模板文件,来演示一下每一个区域的作用。这里就先做一个简单的模板文件,用于演示一下如何通过Java向模板文件中填充数据。

2.2、制作模板文件

首先删除文件中不需要的区域,选择需要删除的元素,右键点击Delete就行啦:

只保留Title和Detail两个区域,删除之后的效果如下所示:

从右侧组件元素栏里面,选择【Text Field】组件,将其拖到Title区域中,如下:

选中刚刚添加的组件,可以编辑它的样式,例如:字体、字体大小、对齐方式等、颜色等属性。在【outline】区域中的【Paramater】,右键创建一个参数,如下所示:

接着在右下角区域的【Properties】中,输入参数名称以及参数对应的Java数据类型,如下:

参数创建完成之后,就可以再次选择我们的之前拖到Title区域的【Text Field】组件,在右下角【Properties】属性区域,设置组件使用的参数值名称。

这里使用的Parameters参数,之后可以通过Java代码直接传递一个Map对象进行数据填充替换,按照这个方式,可以多创建几个测试参数,最终制作的简单模板如下所示:

既然模板文件制作好了,那就可以使用Java语言将需要填充的数据写入到模板文件里面啦。

三、使用Java填充数据

3.1、引入依赖

在实际开发中,一般都是Web工程项目,所以这里是采用SpringBoot工程搭建的一个项目环境,需要引入JasperReports相关的依赖,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.gitcode.demo</groupId>
    <artifactId>jasper-demo</artifactId>
    <version>1.0.0</version>

    <parent>
        <artifactId>spring-boot-starter-parent</artifactId>
        <groupId>org.springframework.boot</groupId>
        <version>2.3.5.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- JasperReports 报表开发所需依赖 START -->
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.20.0</version>
            <exclusions>
                <!--
                    排除自带的itext依赖,因为自带的itext版本是 2.1.7.js10
                    这个版本在中央仓库里面没有,无法下载
                -->
                <exclusion>
                    <groupId>com.lowagie</groupId>
                    <artifactId>itext</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入itext依赖,因为JasperReports中使用了itext操作PDF -->
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <!-- JasperReports 报表开发所需依赖 END -->
        <!--
            引入 poi 依赖,因为 jasper 底层操作excel使用的是poi组件
        -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>
</project>

3.2、创建JasperReportsUtil工具类

为了方便操作Jasper报表,这里在统一的类里面进行报表的处理,代码如下所示:

package com.gitcode.demo.util;

import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.export.JRXlsExporter;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.export.*;
import org.springframework.core.io.ClassPathResource;

import java.io.InputStream;
import java.util.Map;
import java.util.Objects;

/**
 * @version 1.0.0
 * @Date: 2023/8/7 14:14
 * @Author ZhuYouBin
 * @Description: JasperReports 工具类
 */
public class JasperReportsUtil {

    /**
     * 使用 JasperReports 生成报表文件
     * @param templatePath 模板文件路径及名称
     * @param fileName 生成的文件名称
     * @param fileType 生成的文件类型,例如: pdf、html、xls 等
     * @param parameters 传递到 jrxml 模板文件中的数据参数
     * @return 返回生成的报表文件路径
     */
    public static String generateReport(String templatePath, String fileName, String fileType, Map<String, Object> parameters) throws Exception {
        // 1、获取 jasper 模板文件【采用流的方式读取】
        ClassPathResource resource = new ClassPathResource(templatePath);
        InputStream in = resource.getInputStream();
        JasperReport jasperReport = (JasperReport) JRLoader.loadObject(in);
        // 2、将 parameters 数据参数填充到模板文件中
        JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JREmptyDataSource());
        // 3、按照指定的 fileType 文件类型导出报表文件
        if (Objects.equals("pdf", fileType)) {
            JasperExportManager.exportReportToPdfFile(jasperPrint, fileName + ".pdf");
        } else if (Objects.equals("xls", fileType)) { // 导出 xls 表格
            JRXlsExporter exporter = new JRXlsExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); // 设置导出的输入源
            exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(fileName + ".xls")); // 设置导出的输出源
            // 配置信息
            SimpleXlsReportConfiguration configuration = new SimpleXlsReportConfiguration();
            configuration.setOnePagePerSheet(true); // 每一页一个sheet表格
            exporter.setConfiguration(configuration); // 设置配置对象
            exporter.exportReport(); // 执行导出
        } else if (Objects.equals("xlsx", fileType)) {  // 导出 xlsx 表格
            JRXlsxExporter exporter = new JRXlsxExporter();
            exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); // 设置导出的输入源
            exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(fileName + ".xlsx")); // 设置导出的输出源
            SimpleXlsxReportConfiguration configuration = new SimpleXlsxReportConfiguration();
            configuration.setOnePagePerSheet(true); // 每一页一个sheet表格
            exporter.setConfiguration(configuration);
            exporter.exportReport(); // 执行导出
        } else if (Objects.equals("html", fileType)) {
            JasperExportManager.exportReportToHtmlFile(jasperPrint, fileName + ".html");
        }
        return null;
    }

}

3.3、测试控制器类

编写一个TestController测试控制器,然后在代码中添加需要填充的模板数据,如下:

package com.gitcode.demo.web;

import com.gitcode.demo.util.JasperReportsUtil;
import net.sf.jasperreports.engine.util.JRResourcesUtil;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.ResourcePatternUtils;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/8/10 21:13
 * @Author ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/report")
public class TestController {

    @GetMapping("/export")
    public String exportFile(String format) throws Exception {
        ClassPathResource resource = new ClassPathResource("MyFirstReport.jasper");
        String templatePath = resource.getPath();
        String fileName = "Jasper导出文件";
        /*
         创建传递到 Jasper 模板文件中的数据参数。
         注意:参数的 key 必须和 Jasper Studio 中创建的 Parameters 参数名称相同,否则匹配不上,无法填充数据。
         */
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("titleName", "This is a title.");
        parameters.put("userName", "Tom");
        parameters.put("sex", "man");
        parameters.put("age", "20");
        parameters.put("address", "everywhere.");
        // 执行导出操作
        return JasperReportsUtil.generateReport(templatePath, fileName, format, parameters);
    }

}

3.4、放置Jasper模板文件

将之前制作好的Jasper模板文件编译,编译之后会生成一个【.jasper】后缀的文件,这个文件就是我们要的模板文件,要把这个文件放到工程的【src/main/resources】资源目录里面,如下所示:

3.5、运行测试

启动工程,打开浏览器访问http://localhost:8080/api/report/export?format=pdf地址,此时会在工程目录下,生成对应的文件:

打开文件查看内容,如下所示:

到此,Jasper Studio报表工具的安装、制作简单模板以及使用Java填充模板文件数据就介绍完啦。

综上,这篇文章结束了,主要介绍如何安装Jasper Studio报表开发工具以及使用Java填充模板文件内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/859888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CC++内存管理

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;c内存管理方式new/delete 操作内置类型new和delete操…

不看太后悔了!呕心沥血总结JVM!

一、JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; …

[HDLBits] Mt2015 q4b

Circuit B can be described by the following simulation waveform: Implement this circuit. module top_module ( input x, input y, output z );//001 100 010 111assign z(xy); endmodule

wordpress数据表中标签和分类如何区分?

wordpress中标签和分类是什么关系怎么区分&#xff1f;最后有一个群的网友告诉了我文章ID和标签ID的关系是放在了wp_term_relationships表中&#xff0c;然后我百度了下这个表的结构和相关介绍&#xff0c;发现果然如此&#xff0c;先把文章保存起来&#xff1a; wp_term_rela…

数据结构——空间复杂度

3.空间复杂度 空间复杂度也是一个数学表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度 。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂…

基于SLAM的规划算法仿真复现|SLAM|智能规划

图片来自百度百科 前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.n…

getchar()清空缓冲区剩余的空格回车等转义字符

getchar()清空缓冲区剩余的空格回车等转义字符 多次使用scanf输入字符会出现以下错误&#xff1a; #include <stdio.h> int main() {char a,b,c,d,e,f;printf("input character a,b\n");scanf("%c,%c",&a,&b);printf("a %c,b %c\n&…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

C++-排序

文章目录 常数操作时间复杂度空间复杂度O(N^2) O(1) 数据情况发生变化不影响流程 选择排序冒泡排序使用抑或运算提取出不为零的数最右边的1 1. 实现两个变量交换值2. 数组中一种数字出现奇数次,other是偶数次,找到那一种数字3. 数组中有两种数字出现奇数次,other是偶数次,找到那…

修改SqlSugar的WebFirst 代码生成器适配瀚高数据库

WebFirst代码生成器是果糖大数据团队开发的新一代 高性能 代码生成器&数据库设计工具&#xff0c;由.net core 3.1 sqlsugar 开发 &#xff08;此处摘抄自官网 &#x1f601;&#xff09; 官网地址 WebFirst 目前官网发布的版本并没有集成瀚高数据库的支持&#xff0c;本文…

hive on tez资源控制

sql insert overwrite table dwintdata.dw_f_da_enterprise2 select * from dwintdata.dw_f_da_enterprise; hdfs文件大小数量展示 注意这里文件数有17个 共计321M 最后是划分为了21个task 为什么会有21个task&#xff1f;不是128M 64M 或者说我这里小于128 每个文件一个map…

这34道接口测试 Jmeter面试题,你会吗?

接口测试 & Jmeter面试题 一、接口测试 1、接口测试流程 1、首先是从开发那里拿到API接口文档&#xff0c;了解接口业务、包括接口地址、请求方式&#xff0c;入参、出参&#xff0c;token鉴权&#xff0c;返回格式等信息。 2、然后使用Postman或Jmeter工具执行接口测试…

【图像恢复】基于交替乘子方法(ADMM)图像恢复算法研究[固定点收敛和应用](Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

form 表单恢复初始数据

写表单的时候&#xff0c;想做到&#xff0c;某个操作时&#xff0c;表单恢复初始数据 this.$options.data().form form 是表单的对象 <template><div><el-dialog title"提示" :visible.sync"dialogVisible"><el-form :model"…

前端学习记录~2023.7.30~JavaScript重难点实例精讲~第4章 对象

第 4 章 对象 前言4.1 对象的属性和访问方式4.1.1 对象的属性&#xff08;1&#xff09;数据属性&#xff08;2&#xff09;访问器属性 4.1.2 属性的访问方式&#xff08;1&#xff09;使用.访问属性&#xff08;2&#xff09;使用[]访问属性&#xff08;3&#xff09;两者的不…

虫情测报灯的功能优势

KH-CQPest虫情测报灯是一款利用现代光、电、数控集成的虫情测报仪器。它可以通过光学/药物诱虫方式实现自动诱虫&#xff0c;并将诱捕的害虫进行无公害红外远程自动处理&#xff0c;在完成杀虫、虫体分散、拍照、运输等作业后&#xff0c;KH-CQPest虫情测报灯会自动将监测到的虫…

Clone函数

概述 Clone函数是一种用于复制的计算机函数。在程序编写中&#xff0c;除了自定义一个拷贝构造函数来实现对象复制外&#xff0c;还可以实现一个clone函数。这需要借助编译器实现的一个隐藏拷贝构造函数&#xff0c;这样的做法&#xff0c;更省心。 中文名clone函数外文名clon…

ELF program/section segment解析

ELF program/section segment解析 1 elf program segment1.1 elf program header1.2 ELF32和ELF64示例1.2.1 ELF32 program segment1.2.2 ELF64 program segment 1.3 elf program segment数据流向图 2 elf section2.1 eld section header2.2 ELF32和ELF64示例2.2.1 ELF32 secti…

带你玩转双链表

文章目录 前言一、双链表的思路二、带头循环双链表的实现分析二、带头循环双链表的实现11.带头循环双链表实现头文件总览2.带头循环双链表的初始化3.带头循环双链表的插入4.带头循环双链表的打印和销毁5.带头循环双链表的查找和删除 三、带头循环双链表的实现21.带头循环双链表…

软考高级之系统架构师之数据通信与计算机网络

概念 OSPF 在划分区域之后&#xff0c;OSPF网络中的非主干区域中的路由器对于到外部网络的路由&#xff0c;一定要通过ABR(区域边界路由器)来转发&#xff0c;既然如此&#xff0c;对于区域内的路由器来说&#xff0c;就没有必要知道通往外部网络的详细路由&#xff0c;只要由…