Jasper Report详细使用教程(保姆级教程),整合Springboot使用

news2024/11/20 12:29:04

Jasper Report详细使用教程

    • 1、下载Jaspersoft Studio
    • 2、编写jrxml文件
    • 3、编译模板文件
    • 4、输出PDF报表(SpringBoot整合)
    • 5、解决中文乱码(不显示的问题)
    • 6、最后

1、下载Jaspersoft Studio

官网下载地址:https://community.jaspersoft.com/project/jaspersoft-studio/releases

2、编写jrxml文件

  • 2.1 新建项目
    使用Jaspersoft Studio来创建一个项目,如图所示,新建一个项目,步骤: File -> New -> Project->JasperReportsProject
    在这里插入图片描述

  • 2.2 新建一个Jasper Report模板
    找到你新建的项目。步骤:项目右键 -> New -> Jasper Report,选择 Blank A4 (A4纸大小的模板),然后点击Next并对模板命名。
    在这里插入图片描述
    如图所示,报表模板被垂直的分层,每一个部分都是一个Band,每一个Band的特点不同:
    在这里插入图片描述
    Title(标题): 只在整个报表的第一页的最上端显示。只在第一页显示,其他页面均不显示。
    Page Header(页头): 在整个报表中每一页都会显示。在第一页中,出现的位置在 Title Band的下面。在除了第一页的其他页面中Page Header 的内容均在页面的最上端显示。
    Page Footer(页脚): 在整个报表中每一页都会显示。显示在页面的最下端。一般用来显示页码。
    Detail 1(详细): 报表内容,每一页都会显示。
    Column Header(列头): Detail中打印的是一张表的话,这Column Header就是表中列的列头。
    Column Footer(列脚): Detail中打印的是一张表的话,这Column Footer就是表中列的列脚。
    Summary(统计): 表格的合计段,出现在整个报表的最后一页中,在Detail 1 Band后面。主要是用来做报表的合计显示。

  • 2.3 通过右边控件画出一个简单的报表模型
    红框部分,上面是各种组件窗口,下面是组件的属性设置窗口。
    在这里插入图片描述

    • 2.3.1 JasperSoft studio常用控件的使用方法
      • 1 、Static Text: 静态文本控件,用于展示静态文本
      • 3、Text Field: 动态文本控件,可从数据库,或者是Map集合,或者JavaBean中获取数据,然后填充到此组件中。
        语法:$F{value}
      • 3、Image: 图片控件,此控件有两个常用值,如下图所示
        在这里插入图片描述

3、编译模板文件

在这里插入图片描述

完成页面布局设计以后,找到自己刚刚设计好的jrxml文件,右击此文件,然后编译此文件
步骤:右击–>JasperReport–>Compile Report。此时会生成一个.jasper文件,将此文件复制到你的项目中。

4、输出PDF报表(SpringBoot整合)

  • 4.1 导入依赖
        <!-- https://mvnrepository.com/artifact/net.sf.jasperreports/jasperreports -->
        <!--Jasper Report-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.17.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.17.0</version>
            <!--<scope>system</scope>
            <systemPath>${project.basedir}/lib/jasperreports-fonts-6.17.0.jar</systemPath>-->
        </dependency>
        <dependency>
            <groupId>net.sf.barcode4j</groupId>
            <artifactId>barcode4j</artifactId>
            <version>2.1</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.barbecue</groupId>
            <artifactId>barbecue</artifactId>
            <version>1.5-beta1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.xmlgraphics</groupId>
            <artifactId>batik-bridge</artifactId>
            <version>1.14</version>
        </dependency>
  • 4.2 将第3步中编译好的.jasper文件复制到resource目录下。目录结构如图所示
    在这里插入图片描述
  • 4.3 编写测试代码(分别是直接输出到PDF文件,以及输出到网页显示)
//以下代码写在上述目录结构中的MainStaterTest测试类中。
    @Test
    public void test2() throws IOException, JRException {
        //1.读取模板文件
        Resource resource = new ClassPathResource("static/test2.jasper");

        Map<String,Object> parms = new HashMap<String, Object>();
        //3.模板和数据整合
        JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(resource.getFile()), parms, new JREmptyDataSource());
        //4.导出PDF
        JasperExportManager.exportReportToPdfStream(jasperPrint,new FileOutputStream("E:\\Users\\c先生\\Desktop\\demo.pdf"));
    }

上述代码是直接输出PDF文件

package com.lx.comtroller;

import com.lx.mapper.UserMapper;
import com.lx.pojo.User;
import com.lx.service.UserService;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author c先生
 * @date 2022年09月10日 下午 3:07:34
 * @describe
 */
@RestController
@RequestMapping("/jasper")
public class JasperController {

    @Autowired
    DataSource dataSource;
    @Autowired
    UserService userService;
    @Autowired
    UserMapper userMapper;

    /**
     * 展示静态文字
     * @param request
     * @param response
     */
    @RequestMapping("/test")
    public void test(HttpServletRequest request, HttpServletResponse response){
        //引入jasper文件
        Resource resource = new ClassPathResource("static/test1.jasper");
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            FileInputStream fis = new FileInputStream(resource.getFile());
            JasperPrint jasperPrint = JasperFillManager.fillReport(fis, new HashMap<String, Object>(), new JREmptyDataSource());
            JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JRException e) {
            e.printStackTrace();
        }
    }

    /**
     * 用Map传递参数
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping("/test2")
    public void test2(HttpServletRequest request, HttpServletResponse response) throws Exception{
        Resource resource = new ClassPathResource("static/test2.jasper");
        ServletOutputStream outputStream = response.getOutputStream();
        FileInputStream fis = new FileInputStream(resource.getFile());
        Map map = new HashMap();
        map.put("username","李欣");
        map.put("password","666666");
        JasperPrint jasperPrint = JasperFillManager.fillReport(fis, map, new JREmptyDataSource());
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }

    /**
     * 从数据库中获取全部数据
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping("/test3")
    public void test3(HttpServletRequest request, HttpServletResponse response) throws Exception{
        Resource resource = new ClassPathResource("static/test3.jasper");
        ServletOutputStream outputStream = response.getOutputStream();
        FileInputStream fis = new FileInputStream(resource.getFile());
        Connection connection = dataSource.getConnection();
        JasperPrint jasperPrint = JasperFillManager.fillReport(fis, new HashMap<>(), connection);
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }

    /**
     * 从数据库中获取指定条件的数据,然后将数据存入List集合,最后展示到页面
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping("/test4")
    public void test4(HttpServletRequest request, HttpServletResponse response) throws Exception{
        Resource resource = new ClassPathResource("static/test4.jasper");
        ServletOutputStream outputStream = response.getOutputStream();
        FileInputStream fis = new FileInputStream(resource.getFile());
        List<User> userList = userMapper.selectList(null);
        JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(userList);
        JasperPrint jasperPrint = JasperFillManager.fillReport(fis, new HashMap<>(), source);
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }

    /**
     * 同上,加入了页码展示,以及分组报表
     * @param request
     * @param response
     * @throws Exception
     */
    @RequestMapping("/test5")
    public void test5(HttpServletRequest request, HttpServletResponse response) throws Exception{
        Resource resource = new ClassPathResource("static/test5.jasper");
        ServletOutputStream outputStream = response.getOutputStream();
        FileInputStream fis = new FileInputStream(resource.getFile());
        List<User> userList = userMapper.selectList(null);
        JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(userList);
        JasperPrint jasperPrint = JasperFillManager.fillReport(fis, new HashMap<>(), source);
        JasperExportManager.exportReportToPdfStream(jasperPrint,outputStream);
    }
}

上述代码是输出到网页显示

5、解决中文乱码(不显示的问题)

第一步:配置jasperreports_extension.properties配置文件

net.sf.jasperreports.extension.registry.factory.simple.font.families=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.lobstertwo=stsong/fonts.xml

第一项为固定配置,第二项配置的值需要与目录对应。目录结构如下图所示

在这里插入图片描述

第二步:配置fonts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
    <!--<fontFamily name="Lobster Two">-->
    <!--<normal>lobstertwo/LobsterTwo-Regular.otf</normal>-->
    <!--<bold>lobstertwo/LobsterTwo-Bold.otf</bold>-->
    <!--<italic>lobstertwo/LobsterTwo-Italic.otf</italic>-->
    <!--<boldItalic>lobstertwo/LobsterTwo-BoldItalic.otf</boldItalic>-->
    <!--<pdfEncoding>Identity-H</pdfEncoding>-->
    <!--<pdfEmbedded>true</pdfEmbedded>-->
    <!--<!–-->
    <!--<exportFonts>-->
    <!--<export key="net.sf.jasperreports.html">'Lobster Two', 'Times New Roman', Times, serif</export>-->
    <!--</exportFonts>-->
    <!--–>-->
    <!--</fontFamily>-->
    <fontFamily name="华文宋体">
        <normal>stsong/stsong.TTF</normal>
        <bold>stsong/stsong.TTF</bold>
        <italic>stsong/stsong.TTF</italic>
        <boldItalic>stsong/stsong.TTF</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding>
        <pdfEmbedded>true</pdfEmbedded>
        <exportFonts>
            <export key="net.sf.jasperreports.html">'华文宋体', Arial, Helvetica, sans-serif</export>
            <export key="net.sf.jasperreports.xhtml">'华文宋体', Arial, Helvetica, sans-serif</export>
        </exportFonts>
        <!--
        <locales>
            <locale>en_US</locale>
            <locale>de_DE</locale>
        </locales>
        -->
    </fontFamily>
</fontFamilies>

注意:其中的标签内的值需要与目录结构中字体文件的名字对应。

字体文件stsong.TTF资源下载地址

6、最后

编写jrxml文件的其他注意事项。

首先要模拟数据源创建数据库连接,按照图片往下操作

在这里插入图片描述
在这里插入图片描述

选择Database JDBC Connection

在这里插入图片描述

选择数据库连接驱动 ,输入自己的数据库URL,注意Mysql8.0的URL需要加上端口号以及时区等信息,输入数据库用户名以及密码。 jdbc:mysql://localhost:3306/要连接的数据名字?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

在这里插入图片描述

点击Driver Classpath–>Add,导入数据库连接的Jar包。选择自己本地的jar包
Mysql8.0驱动Jar包下载地址

在这里插入图片描述

最后点击Test,如果显示成功,就说明配置成功,如果不成功,请根据报错信息来检查自己配置是否有问题,测试通过以后点击Finish完成数据库连接的配置。

以下操作均在JasperSoft Studio的Outline窗口中完成

细节一、如何展示数据库的数据

  • 1、步骤:项目名右击–>Dataset and Query…
    在这里插入图片描述

  • 2、选择自己刚刚创建的数据库连接
    在这里插入图片描述

  • 3、选择要查询的数据库,然后在右侧输入sql语句,点击Read Fields,就可以在下方查询到所有的字段了,然后根据需要删除不需要显示的字段,最后点击OK。
    在这里插入图片描述

  • 4、在Field中可以看到自己刚刚查询出来的字段,然后将其拖入到模板的合适位置就可以展示了。
    在这里插入图片描述

在步骤3中,也可以加入条件查询
语法:select * from user where id = $P{p1}。
可以通过Java代码中的Map集合来传入参数,其中Map的Key为 “p1”。

细节二:如何展示分组数据
比如根据员工所在部门展示员工信息,如图所示
在这里插入图片描述

  • 1、步骤:项目右击–>Create Group,来创建一个组
    在这里插入图片描述

  • 2、选择分组依据的字段,然后一路Next
    在这里插入图片描述

  • 3、将字段拖入到Group Header区域中,此字段需要与上一步所选择的字段一致
    在这里插入图片描述

细节三:展示页码
直接找到Variables中的PAGE_NUMBER,将其拖到Page Footer的位置即可
在这里插入图片描述

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

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

相关文章

CSS网页布局

&#x1f4dc;个人简介 ⭐️个人主页&#xff1a;微风洋洋&#x1f64b;‍♂️ &#x1f351;博客领域&#xff1a;编程基础&#x1f4a1;,后端&#x1f4a1;,大数据,信息安全 &#x1f345;写作风格&#xff1a;干货,干货,还是tmd的干货 &#x1f338;精选专栏&#xff1a;【J…

叮咚,您有一封告白信件待查收(原生HTML+CSS+JS绘制表白信件,代码+链接+步骤详解)

马上就要5月20号啦&#xff0c;准备好如何向心仪的她/他表白了嘛&#xff01;特此出一篇告白小信件&#xff0c;效果图如下。纯htmlcss绘制&#xff0c;包含详细教程注释&#xff0c;干货满满哦。 链接置于文章结尾总结处。 文章目录一、叮咚&#xff01;查收您的信件&#x…

js二十五道面试题(含答案)

目录 1.线程和进程是什么&#xff1f;举例说明 2. js中的基础数据类型有哪几种? 了解包装对象吗&#xff1f; 3.对内存泄漏的了解 4.js中数组合并的方法 5.合并对象的方法 6.什么是作用域&#xff0c;什么是作用域链&#xff1f; 7.JS如何实现异步编程&#xff08;5种&…

1.vite初识、vite搭建项目

1.vite优势 1.1启动速度 解释一下冷启动&#xff1a;它是指输入启动指令后他编译到启动完成的过程&#xff1b; 当你使用vite和webpack后你就会得出这个结论&#xff0c;vite相对于webpack启动速度还是略胜一筹的&#xff0c;当你的项目是小型项目时&#xff0c;不是特别明显…

TypeScript 报错汇总

TypeScript 报错汇总 在这篇文章中将记录我遇到的ts错误&#xff0c;应该会持续更新。 有时候从错误点入手学习似乎是一个不错的选择&#xff0c;所以也欢迎你私信我一些ts的问题。 一、内置工具 1.1 Pick & Partial 先看看Pick和Partial工具的源码&#xff1a; type…

浅析什么是伪类和伪元素?伪类和伪元素的区别解析

一、理解什么是伪类&#xff1f;什么是伪元素&#xff1f; 1、伪类种类 伪类作用对象是整个元素 a:link{color:#111} a:hover{color:#222}div:first-child{color:#333} div:nth-child&#xff08;3&#xff09;{color:#444} 尽管这些条件不是基于DOM的&#xff0c;但结果每一…

面试必问JavaScript基础面试题(附答案详解)

文章目录前言1、JavaScript的数据类型有哪些&#xff1f;2、null&#xff0c;undefined的区别&#xff1f;3、JS中变量的作用域是什么&#xff1f;4、说说var、let、const之间的区别?区别一&#xff1a;作用域区别二&#xff1a;定义变量区别三&#xff1a;let与const区别5、栈…

微信小程序云开发 | 插件的微信小程序云开发

1、插件开发简介 1●插件简介 插件是对一组JavaScript接口、自定义组件或页面的封装&#xff0c;可嵌入小程序中使用。插件不能独立运行&#xff0c;必须嵌入在其他小程序中才能被用户使用&#xff1b;而第三方小程序在使用插件时&#xff0c;也无法看到插件的代码。因此&…

英雄联盟轮播图手动轮播

感谢大朋友们小朋友们的催更&#xff0c;这个月都在努力复习功课&#xff0c;无异于对待期末考试。 通过前一个个小案例越做越熟悉&#xff0c;代码越来越简洁&#xff0c;整体架构越来越规范 一步一步循序渐进&#xff0c;今天写一个英雄联盟轮播图手动轮播练练手。 清除网页的…

js逆向点点数据:自动扣webpak-webpackJsonp思路

url链接:点点数据-App应用市场数据分析,AppStore排行榜,ASO,ASM优化平台 请求数据是k&#xff0c;网址是个标准的webpak&#xff0c;不过有有很多个js文件&#xff0c;文件加起来十几mb&#xff0c;就很恶心 扣的话还是扣知乎webpak的老办法&#xff0c;导出加载器&#xff0c…

【蓝桥杯Web】第十四届蓝桥杯Web模拟赛 3 期 | 精品题解(上)

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ 蓝桥杯专栏&#xff1a;蓝桥杯题解/感悟 &#x1f5a5;️ TS知识总结&#xff1a;十万字TS知识点总结 &#x1f449; 你的一键三连是我更新的最大动力❤️&#xff01; &…

Promise.allSettled()方法介绍

前言&#xff1a; 本篇文章介绍 Promise 对象的Promise.allSettled() 方法&#xff0c;另外的关于 Promise 文章 可以看我的 ES6专栏 promise 实现 Ajax 首先通过 promise 对象实现 Ajax &#xff08;如下&#xff09; &#xff0c;后面 在代码中 会使用到 const getJSON f…

uniapp添加极光推送

1.从dcloud插件市场下载极光SDK插件 &#xff08;可以云打包&#xff0c;也可以离线打包&#xff09; 极光JCore官方SDK下载地址 https://ext.dcloud.net.cn/plugin?id4028https://ext.dcloud.net.cn/plugin?id4028 极光JPush官方SDK下载地址 极光JPush官方SDK - DCloud 插…

Request获取请求数据中文乱码问题

目录 一、当Request请求字母时&#xff0c;输出正常 二、当Request请求参数为汉字时 三、使用伪代码了解乱码的形成 URL编码 四、Request请求参数中文乱码-Post请求解决方案 五、Request请求参数中文乱码-Get请求解决方案 前言&#xff1a;Tomcat在7以及更低版本时&#…

【虚幻引擎UE】UE5 实现WEB和UE通讯思路(含工程源码)

UE5实现WEB和UE通讯思路 两个方案,根据需求选择适合自己的: 1.UE打包为像素流页面,嵌入WEB进行通讯。 2.UE和WEB基于WEB UI插件实现通讯,打包为像素流页面。 实现效果如下 ↓ 本文着重说明第二种方案。 示例项目工程文件:https://download.csdn.net/download/qq_35079…

使用nodejs写接口

一、基本步骤 要使用Node.js编写接口&#xff0c;需要遵循以下步骤&#xff1a; 1、安装Node.js&#xff1a;如果尚未在计算机上安装Node.js&#xff0c;可以在Node.js的官方网站上下载安装程序&#xff0c;并按照说明进行安装。 2、初始化项目&#xff1a;在项目文件夹中打…

完美解决 - 前端发版后浏览器缓存问题(发版后及时拉取最新版本代码)

一、简介 开发完发布新版本后&#xff0c;在有些电脑上总需要强刷才能获取到最新版本的内容&#xff0c;太恶心了。 浏览器缓存&#xff08;Browser Caching&#xff09;是为了节约网络的资源加速浏览&#xff0c;浏览器在用户磁盘上对最近请求过的文档进行存储&#xff0c;当…

为什么要将程序部署到云服务器上?华为云Web及移动App上云解决方案体验测评

Web及移动App上云是指将Web应用程序或移动应用程序部署到云计算平台上&#xff0c;以便用户可以通过互联网访问这些应用程序。这种部署方式可以提高应用程序的可靠性、可扩展性和安全性&#xff0c;同时也可以降低应用程序的运营成本。 三大特性决定系统的稳定能力 部署应用服务…

【中秋征文】“海上生明月”中秋节网页特效

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

van-uploader上传图片实现过程、使用原生input实现上传图片

1、使用van-uploader 使用van-uploader组件上传图片&#xff0c;并将其封装成组件&#xff0c;接收传入的参数imglist。图片地址为服务器返回的。 完整代码 <template><div class"image-uploader"><div class"list-img" v-for"(src…