发布时间:2023-05-06 文章分类:WEB开发, 电脑百科 投稿人:赵颖 字号: 默认 | | 超大 打印

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文件

3、编译模板文件

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

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

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

        <!-- 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>
//以下代码写在上述目录结构中的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

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

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

第二步:配置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文件的其他注意事项。

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

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

选择Database JDBC Connection

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

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

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

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

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

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

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

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

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

细节二:如何展示分组数据
比如根据员工所在部门展示员工信息,如图所示
Jasper Report详细使用教程(保姆级教程),整合Springboot使用

细节三:展示页码
直接找到Variables中的PAGE_NUMBER,将其拖到Page Footer的位置即可
Jasper Report详细使用教程(保姆级教程),整合Springboot使用