【JasperReports笔记02】如何使用Jasper Studio中的table组件制作简单表格模板文件,并且通过Java + Parameters参数填充表格数据

这篇文章,主要介绍如何使用Jasper Studio中的table组件制作简单表格模板文件,并且通过Java + Parameters参数填充表格数据。

目录

一、Jasper制作表格模板

1.1、制作模板文件

(1)创建参数

(2)添加table组件

(3)添加表格列头

(4)创建表格Field字段

(5)表格使用Field字段

(6)设置表格数据集来源

1.2、使用Java填充模板文件

(1)引入依赖

(2)添加模板文件

(3)编写JasperReportsUtil工具类

(4)编写测试类

(5)运行测试


一、Jasper制作表格模板

1.1、制作模板文件

(1)创建参数

首先打开Jasper Studio开发工具,创建一个MyTable.jasper报表文件,如下所示:

接着创建一个叫做【tableData】的Parameters参数,并且这个参数的数据类型设置成【JRBeanCollectionDataSource】,这个是JavaBean的集合类型,也就是多个JavaBean对象的集合。

在弹出的对话框中,输入【JRBeanCollectionDataSource】,选择这个类型,点击确定就可以了啦。

到这里,我们就把表格的数据集创建好了,接着就要添加table表格组件啦。

(2)添加table组件

在右上角的【Palette】区域中,选择Table组件,

然后将Table组件拖拽到Detail区域里面,此时会出现一个弹出框,让你选择表格的数据源,也就是表格里面的数据从哪里获取。

这里我们现在点击next,进入到下一个窗口,这个窗口中我们勾选【Create an empty dataset】,也就是创建一个空的数据集。

继续点击next,选择【Don't use any connection or Data Source】。

一直点击next之后,就会进入到表格布局界面,此时可以选择表格布局样式,例如:表格头、表格列尾、表格分组列头等,如下:

根据自己的实际情况来选择,我这里就选择了两个,即:表格的列头、表格的头。

双击表格组件,此时就进入到table组件的编辑区域,如下所示:

这里我们添加几列,选择Column Header,右键点击创建列即可。

这里要创建几列,根据你自己的实际需求来决定,例如:我这就创建了四列,如下:

可以发现,我们的创建列没有宽度好像太小,都没有占满整个table区域,你可以设置每一列的宽度,也可以直接选中table空白区域,然后在右下角区域可以设置列宽度自适应。

(3)添加表格列头

(4)创建表格Field字段

(5)表格使用Field字段

(6)设置表格数据集来源

到此,表格的数据集以及模板都设置好勒,下面就可以在Java中填充对应的数据字段咯。

1.2、使用Java填充模板文件

(1)引入依赖

创建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>

(2)添加模板文件

将刚刚制作好的模板文件放入到【src/main/resources】目录下面,如下图:

(3)编写JasperReportsUtil工具类

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 (fileType == null || "".equals(fileType.trim())) {
            fileType = "pdf";
        }
        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;
    }

}

(4)编写测试类

package com.gitcode.demo.web;

import com.gitcode.demo.util.JasperReportsUtil;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @version 1.0.0
 * @Date: 2023/8/12 16:34
 * @Author ZhuYouBin
 * @Description:
 */
@RestController
@RequestMapping("/api/report")
public class TableController {


    @GetMapping("/table")
    public String exportFile(String format) throws Exception {
        ClassPathResource resource = new ClassPathResource("MyTable.jasper");
        String templatePath = resource.getPath();
        String fileName = "Jasper导出PDF文件";
        /*
         创建传递到 Jasper 模板文件中的数据参数。
         注意:参数的 key 必须和 Jasper Studio 中创建的 Parameters 参数名称相同,否则匹配不上,无法填充数据。
         */
        Map<String, Object> parameters = new HashMap<>();
        // 表格数据集是 JRBeanCollectionDataSource 类型的,也就是 JavaBean 实体类类型
        List<Map<String, String>> data = this.getData(100);
        JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(data);
        parameters.put("tableData", dataSource); // 这里的 tableData 字段名称就是和模板文件中表格数据集的参数名称相同
        // 执行导出操作
        return JasperReportsUtil.generateReport(templatePath, fileName, format, parameters);
    }

    private List<Map<String, String>> getData(int num) {
        List<Map<String, String>> ansMap = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            Map<String, String> map = new HashMap<>();
            // 这里的 key 必须和模板文件中的 Field 字段的名称相同
            map.put("userName", "name" + i);
            map.put("sex", i % 2 == 0 ? "male" : "female");
            map.put("age", (i + 20) + "");
            map.put("address", "address is " + i);
            ansMap.add(map);
        }
        return ansMap;
    }
}

(5)运行测试

启动工程,打开浏览器,访问http://localhost:8080/api/report/table?format=pdf地址,此时在工程目录下就会生成导出之后的PDF文件,打开文件就可以查看到刚刚制作的表格模板内容:

到此,Jasper Studio制作table表格就介绍完啦。

综上,这篇文章结束了,主要介绍如何使用Jasper Studio中的table组件制作简单表格模板文件,并且通过Java + Parameters参数填充表格数据。

猜你喜欢

转载自blog.csdn.net/qq_39826207/article/details/132219255