JasperReport基础

常见PDF报表的制作方式
  1. iText PDF:iText是著名的开放项目,是用与生成PDF文档的一个Java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。
  2. OpenOffice:OpenOffice是开源的软件且能在Windows和Linux平台下运行,可以灵活的将Word或者Excel转化为PDF文档
  3. Jasper-Report:是一个强大、灵活的报表生成工具、能够展示丰富的页面内容,并将转换成PDF。
JasperReport框架的介绍

JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换为PDF、HTML,或者XML格式。该库完全是由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态的内容。只需要将JasperReport引入工程中即可完成PDF报表的编译、显示、输出等工作。

  • 在开源的Java表工具中,Jasper Report发展是比较好的,比一些商业的报表引擎做得还好,如支持十字交叉报表、统计报表、图形报表、支持多种报表格式输出,如PDF、RTF、XML、CSV、XHTML、TEXT、DOCX以及OpenOffice
  • 数据源支持更多,常用JDBC SQL查询、XML文件、CSV文件、HQL(Hibernate查询),HBase,Java集合等。还允许你义自己的数据源,通过Jasper文件及数据源,Jasper就能生成最终用用户想要的文件格式。
JasperReport的开发步骤
1、JasperReport生命周期

通常我们提到的PDF报表的时候,浮现在脑海中的是最终的PDF文档文件。在JasperReports中,这只是报表生命周期的最后阶段。通过JasperReports生成PDF报表一共要经过三个阶段,我们称之为JasperReport的生命周期,这三各阶段为:设计(Design)阶段、执行(Execution)阶段以及输出(Export)阶段,如下图所示

在这里插入图片描述

2、JasperReport文件处理过程
  1. 通过JasperCompileManager.compileReportToFile(String path);生成Jasper文件
    • path路劲是jrxml文件路径
  2. 通过JasperFillManager.FillReportToFile(String path,HashMap map,JREmptyDataSource jds);生成Jrprint文件
    • path路径是jasper文件
  3. 通过JasperViewer.viewReport(String path,Boolean isXMLFile);预览PDF文件

在这里插入图片描述

  1. JEXML:报表填充模板本质是一个XML
    • JasperReport已经封装了一个dtd,只要按照规定的格式写这各xml文件,那么JasperReport就可以将其解析最终生成报表,但是JasperReport所解析的不是我们常见的xml文件,而是Jrxml文件,其实xml是一样的,只是后缀不一样。
  2. Jasper:由JRXML模板编译生成的二进制文件,用于代码填充数据
    • 解析完成后JasperReport就是开始编译Jrxml文件,将其编译成Jasper文件,因为JasperReport只可以对Jasper文件进行填充数据和转换,这步操作就跟我们Java中将Java文件编译成Class文件一样的。
  3. Jrpint:当用数据填充完Jasper后生成的文件,用于输出报表。
    • 这一步是JasperReport的核心所在,它会根据你在xml里面写好的查询语句来查询指定是数据库,也可以控制在后台编写查询语句,参数,数据库。在报表填充完后,会再生成一个Jrpint格式的文件(读取Jasper文件进行填充,然后生成一个jrprint文件)
  4. Exporter:决定要输出的报表为何种格式,报表输出的管理类。
3、开发流程概述
  • 制作报表模板
  • 模板编译
  • 构造数据
  • 填充报表数据

模板工具JasperSoftStudio

1、概述

Jaspersoft Studio是JasperReports库和JasperReports服务器的基于Eclipse的报告设计器,它可以作为Eclipse插件或作为独立的应用程序使用。Jaspersoft Studio允许您创建包含图表,图像,子报表,交叉表等的复杂布局。您可以通过JDBC , TableModels , JavaBeans , XML , Hibernate ,大数据(如Hive ) , CSV , XML / A以及自定义来源等各种来源访问数据,然后将报告发布为PDF , RTF , XML , XLS , CSV, HTML , XHTML ,文本, DOCX或OpenOffice。

Jaspersoft Studio是一个可视化的报表设计工具,使用该软件可以方便地对报表进行可视化的设计,设计结果为格式.jrxml的XML文件,并且可以把.jrxml文件编译成.jasper格式文件方便JasperReport报表引擎解析、显示。

2、按照配置

JasperReport官网下载:https://community.jaspersoft.com/community-download

面板介绍

在这里插入图片描述

  • Report editing area (主编辑区域)中,您直观地通过拖动,定位,对齐和通过 Designer palette (设计器调色板 )对报表元素调整大小。JasperSoft Studio 有一个多标签编辑器,Design,Source 和 Preview:
    • Design tab :当你打开一个报告文件,它允许您以图形方式创建报表选中
    • Source tab:包含用于报表的 JRXML 源代码。
    • Preview tab:允许在选择数据源和输出格式后,运行报表预览。
  • Repository Explorer view:包含 JasperServer 生成的连接和可用的数据适配器列表
  • Project Explorer view : 包含 JasperReports 的工程项目清单
  • Outline view:在大纲视图中显示了一个树的形式的方式报告的完整结构。
  • Properties view :通常是任何基于Eclipse的产品/插件的基础之一。它通常被填充与实际所选元素的属性的信息。这就是这样,当你从主设计区域(即:一个文本字段)选择一个报表元素或从大纲,视图显示了它的信息。其中一些属性可以是只读的,但大部分都是可编辑的,对其进行修改,通常会通知更改绘制的元素(如:元素的宽度或高度)
  • Problems view :显示的问题和错误,例如可以阻断报告的正确的编译。
  • Report state summary提供了有关在报表编译/填充/执行统计用户有用的信息。错误会显示在这里I

在这里插入图片描述

使用SpringBoot实现

基础测试

依赖导入(pom.xml)

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.test</groupId>
    <artifactId>jasper</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>jasper-Demo</name>
    <description>jasper-Demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>  
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <!--Java模板引擎-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!--报表模板-->
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId> 
            <version>6.20.0</version>
        </dependency>
        <dependency>
            <groupId>org.olap4j</groupId>
            <artifactId>olap4j</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.lowagie</groupId>
            <artifactId>itext</artifactId>
            <version>2.1.7</version>
        </dependency>
        <!--Apache操作文档-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

代码实现(控制层Controller)

package com.test.jasper.controller;

import net.sf.jasperreports.engine.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
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 java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@RestController
public class JasperController {

    @GetMapping("/testJasper")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1、引入Jasper文件
        Resource resource = new ClassPathResource("templates/Blank_A4.jasper");
        FileInputStream file  = new FileInputStream(resource.getFile());

        //2、创建JasperPrint,向Jasper文件中填充数据
        /**
         * 因为是以请求的方式,因此所有结果都应该以response
         * */
        ServletOutputStream os = response.getOutputStream();
        try{
            /**
             * file:jasper文件输入流
             * new HashMap():向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *      填充模板的数据源(connection,javaBean,Map)
             *      填充空数据源:JREmptyDataSource
             * */
            JasperPrint print = JasperFillManager.fillReport(file, new HashMap<>(), new JREmptyDataSource());
            /**
             * 将作为第一个参数接收的生成报表对象导出为PDF格式,并将结果写入第二个参数指定的输出流。
             * 参数:jasperPrint -报告对象导出输出流-输出流写入结果PDF内容参数
             * */
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            throw new RuntimeException(e);
        }finally {
         os.flush();
        }
    }
}

JasperReport中文不显示处理

可以在c:\windows\fonts中找到华文宋体

在这里插入图片描述

  • 这个字体名为STSONT.TTF

  • 把这个字体文件拷贝到web工程中,并且设置字体信息:

在这里插入图片描述

其中fonts.xml的配置信息如下,这个文件指定了字体信息:


<?xml version="1.0" encoding="UTF-8"?>
 
<fontFamilies>
    <fontFamily name="msyh"><!--字体名称-->
        <normal>fonts/STSONG.TTF</normal><!--字体文件的路径-->
        <bold>fonts/STSONG.TTF</bold>
        <italic>fonts/STSONG.TTF</italic>
        <boldItalic>fonts/STSONG.TTF</boldItalic>
        <pdfEncoding>Identity-H</pdfEncoding><!--这里的定义就与上面1.1的图设置相匹配了-->
        <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>
    </fontFamily>
</fontFamilies>

另外再新建一个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=fonts/fonts.xml

在这里插入图片描述

Map传递参数

JasperSoft工具操作

  1. 创建Parameter
    在这里插入图片描述

  2. 查看Parameter对其进行编辑
    在这里插入图片描述

在这里插入图片描述

  1. 将编辑好的Parameter设计模板

在这里插入图片描述

  1. 生成Jasper文件,在Java代码进行编写
package com.test.jasper.controller;

import net.sf.jasperreports.engine.*;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

@RestController
public class ParamDBJasperController {

    @GetMapping("/testJasper2")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1、引入Jasper文件
        Resource resource = new ClassPathResource("templates/Param_DB.jasper");
        FileInputStream file  = new FileInputStream(resource.getFile());

        //2、创建JasperPrint,向Jasper文件中填充数据
        /**
         * 因为是以请求的方式,因此所有结果都应该以response
         * */
        ServletOutputStream os = response.getOutputStream();
        try{
            /**
             * file:jasper文件输入流
             * new HashMap():向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *      填充模板的数据源(connection,javaBean,Map)
             *      填充空数据源:JREmptyDataSource
             * */

            Map<String, Object> map = new HashMap<>();
            map.put("id",1);
            map.put("username","nick");
            map.put("password","admin");
            map.put("deptId",1);
            JasperPrint print = JasperFillManager.fillReport(file, map, new JREmptyDataSource());
            /**
             * 将作为第一个参数接收的生成报表对象导出为PDF格式,并将结果写入第二个参数指定的输出流。
             * 参数:jasperPrint -报告对象导出输出流-输出流写入结果PDF内容参数
             * */
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            throw new RuntimeException(e);
        }finally {
         os.flush();
        }
    }
}
  1. 效果
    在这里插入图片描述
JDBC数据源填充数据

采用JDBC数据源填充Jasper模板生成PDF报表的:

  1. 以在JasperSoft中创建数据适配器
    在这里插入图片描述
    适配器中包含了多种连接方式在这里我们使用JDBC方式
    在这里插入图片描述

编辑JDBC数据库连接
在这里插入图片描述

添加Mysql驱动包:Mysql驱动包可以从自己的Maven本地仓库中获取,也可以在网上下载。

注意:Mysql驱动包

在Mysql8开始驱动发生了变化变为:com.mysql.cj.jdbc.Driverr
在这里插入图片描述
数据适配器完成以后,生成jrxml文件,创建数据集生成Fields
在这里插入图片描述
编写完成生成Fields
在这里插入图片描述
在这里插入图片描述
将Fields在模板中进行布局设置

在这里插入图片描述
如果编写数据集在编写SQL需要添加参数可以在Parameters中设置参数
在这里插入图片描述
在这里插入图片描述

生成Jasper文件

生成后编写Java代码

package com.test.jasper.controller;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
@RestController
public class JDBCParametersJasperController {
    @Value("${spring.datasource.driver-class-name}")
    private String driver;
    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @GetMapping("/testJasper4")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1、引入Jasper文件
        Resource resource = new ClassPathResource("templates/JDBC_Param.jasper");
        FileInputStream file  = new FileInputStream(resource.getFile());
        //2、创建JasperPrint,向Jasper文件中填充数据
        /**
         * 因为是以请求的方式,因此所有结果都应该以response
         * */
        try(ServletOutputStream os = response.getOutputStream()){
            /**
             * file:jasper文件输入流
             * new HashMap():向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *      填充模板的数据源(connection,javaBean,Map)
             *      填充空数据源:JREmptyDataSource
             * */
            Map<String, Object> map = new HashMap<>();
            map.put("id",1);//Parameters参数
            //数据库连接
            Connection connection = getConnection();
            JasperPrint print = JasperFillManager.fillReport(file, map,connection);
            /**
             * 将作为第一个参数接收的生成报表对象导出为PDF格式,并将结果写入第二个参数指定的输出流。
             * 参数:jasperPrint -报告对象导出输出流-输出流写入结果PDF内容参数
             * */
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * @return 数据源连接
     */
    public Connection getConnection(){
        try {
            Class.forName(this.driver);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        try {
            Connection connection = DriverManager.getConnection(this.url, this.username, this.password);
            return connection;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

结果
在这里插入图片描述

JavaBean数据源填充报表

这种方式是使用Java集合如List、Set、Map、Tree集合对Jasper文件进行赋值填充生成PDF文档,主要是使用JasperReports中的JRBeanCollectionDataSource(Collection collection);进行填充赋值。
在这里插入图片描述
代码实现

package com.test.jasper.controller;
import com.test.jasper.pojo.User;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.*;

@RestController
public class BeanParametersJasperController {

    @GetMapping("/testJasper5")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1、引入Jasper文件
        Resource resource = new ClassPathResource("templates/Bean_Param.jasper");
        FileInputStream file  = new FileInputStream(resource.getFile());
        //2、创建JasperPrint,向Jasper文件中填充数据
        /**
         * 因为是以请求的方式,因此所有结果都应该以response
         * */
        try(ServletOutputStream os = response.getOutputStream()){
            /**
             * file:jasper文件输入流
             * new HashMap():向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *      填充模板的数据源(connection,javaBean,Map)
             *      填充空数据源:JREmptyDataSource
             * */
            Map<String, Object> map = new HashMap<>();
            //Bean数据连接
            List<User> list = getListUser();
            System.out.println("list = " + list);
            JRBeanCollectionDataSource source = new JRBeanCollectionDataSource(list);
            JasperPrint print = JasperFillManager.fillReport(file, map,source);
            /**
             * 将作为第一个参数接收的生成报表对象导出为PDF格式,并将结果写入第二个参数指定的输出流。
             * 参数:jasperPrint -报告对象导出输出流-输出流写入结果PDF内容参数
             * */
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (JRException e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * @return 模拟查询数据
     */
    public List<User> getListUser(){
        List<User> list = new ArrayList<>();
        for (int i =0 ; i<=10 ; i++){
            list.add(new User(i,"用户"+i,"admin", LocalDateTime.now(),LocalDateTime.now(),i));
        }
        return list;
    }
}

结果
在这里插入图片描述

分组模板

有两种情况会使用分组报表:

  • 美观和好看的显示
  • 当数据分为两层表时,经常需要批量打印子表数据。打印时,常常需要按照父表的外键或关键值进行自动分组,即每一条父表记录所属的子表记录打印到一组报表中,每组报表都单独计数及计算页数。

在应用中,可以通过选择需要打印的父表记录,将父表记录的ID传如,由报表自动进行分组

设置分组
  1. 在Outline中右击选择Create Group
  2. 选择需要分组的字段点击Next==>Finish,JasperSoft会自动创建两个Group Header GroupFooter
    • Group Header (分组头部信息):一般显示分组的字段。
    • Group Footer(分组脚部信息):一般显示显示条数或者一些辅助信息。
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
Variables

Variables(变量)是用于在报表中存储和计算数据的一种机制

  1. PAGE_NUMBER(当前页码):该变量返回当前页的页码。
  2. MASTER_CURRENT_PAGE(主报表当前页码):当在子报表中使用时,该变量返回主报表当前的页码。
  3. MASTER_TOTAL_PAGES(主报表总页数):当在子报表中使用时,该变量返回主报表的总页数。
  4. COLUMN_NUMBER(列编号):该变量返回当前列的编号。可以在表格或交叉表中使用。
  5. REPORT_COUNT(报表计数):该变量返回当前报表在整个报表执行过程中的计数。通常在页脚或报表总结中使用。
  6. PAGE_COUNT(总页数):该变量返回整个报表的总页数。
  7. COLUMN_COUNT(总列数):该变量返回表格或交叉表中的总列数。
  8. Group1_COUNT(分组计数):该变量返回特定分组的记录数量。“Group1” 是一个示例,实际使用时可能会根据报表中的分组名称进行命名。
    在这里插入图片描述
图形报表

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

父子报表
概述

复杂报表或数据内容较多的时候,可以使用子报表解决。

制作子报表

例如我们希望子表所展示的内容是一个统计图(饼形),我们需要创建一个子报表并且定义好它所对应的Label(Key)、Value

创建子表和创建普通报表是一样操作,重点是在主表中。

制作父报表

首先制作父报表们就是调用子报表的一个基础报表。主报表的作用有如下两种:

  • 父报表中需要显示数据,使用子报表弥补Studio设计的不足
  • 父报表不需要显示任何数据,只是作为子报表的载体。适用于复杂报表的设计
  1. 首先我们需要创建主表Jasper Report

  2. 在Palette工具中选择Subreport,拖动到模板面板
    在这里插入图片描述

  3. 选择Select an existing report(选择现有报表)
    在这里插入图片描述

  4. 选中Workspace resource (an element inside the workspace)(工作空间资源中选择)选择Browse按钮选中自己定义好的子报表,点击OK点击Finish。子报表的初性以及创建好了。
    在这里插入图片描述

  5. 因为后期需要在Java进行代码编译,并且只能访问主表所以需要提供起给主表一个子表路径,在Outline==>Parameters创建param名字随意我习惯叫Subpath,这个就是后期在Java定义Map中的key,定义好之后点击报表面板上的Subreport(子表)在Expression(子表路径)中给其添加表达式如$P{subpath}(自己定义的)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  6. 因为子报表中是饼状统计图需要赋值而且肯定是集合类型(统计图肯定是多个值),所有我们还需要再父报表中定义Parameters为子报表赋值的数据我叫Sublist,创建好后在Properties=>Object=>Class中填写类型java.util.List,定义好之后继续选中拖动在报表面板上的Subreport(子报表)在Data Source Expressionne编译表达式

    new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($P{sublist})
    

在这里插入图片描述
在这里插入图片描述
将父子两个报表的.jrxml文件编译成.jasper文件
在这里插入图片描述
处理完之后编译Java代码

package com.test.jasper.controller;

import com.test.jasper.pojo.ChartsEntity;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

@RestController
public class ParentParametersJasperController {

    @GetMapping("/testJasper8")
    public void createPdf(HttpServletRequest request, HttpServletResponse response) {
        //1、引入Jasper文件
        Resource resource = new ClassPathResource("templates/Main/Test_Main.jasper");
        //2、创建JasperPrint,向Jasper文件中填充数据
        /**
         * 因为是以请求的方式,因此所有结果都应该以response
         * */
        try (FileInputStream file = new FileInputStream(resource.getFile());
             ServletOutputStream os = response.getOutputStream()){
            //子报表路径
            Resource childResource = new ClassPathResource("templates/Main/Chart_Child.jasper");
            /**
             * file:jasper文件输入流
             * new HashMap():向模板中输入的参数
             * JasperDataSource:数据源(和数据库数据源不同)
             *      填充模板的数据源(connection,javaBean,Map)
             *      填充空数据源:JREmptyDataSource
             * */
            String path = childResource.getFile().getPath();
            Map<String,Object> map = new HashMap<>();
            map.put("sublist",getCharts());
            map.put("subpath",path);
            JasperPrint print = JasperFillManager.fillReport(file, map,new JREmptyDataSource());
            /**
             * 将作为第一个参数接收的生成报表对象导出为PDF格式,并将结果写入第二个参数指定的输出流。
             * 参数:jasperPrint -报告对象导出输出流-输出流写入结果PDF内容参数
             * */
            JasperExportManager.exportReportToPdfStream(print,os);
        } catch (IOException|JRException e) {
            throw new RuntimeException(e);
        }
    }
    private List<ChartsEntity> getCharts() {

        List<ChartsEntity> list = new ArrayList<>();
        list.add(new ChartsEntity("运营部门",500L));
        list.add(new ChartsEntity("销售部门",10L));
        list.add(new ChartsEntity("行政部门",53L));
        list.add(new ChartsEntity("服务部门",320L));
        return list;
    }
}

最终结果
在这里插入图片描述

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值