这篇文章,主要介绍如何使用Jasper Studio中的table组件制作简单表格模板文件,并且通过Java + Parameters参数填充表格数据。
目录
一、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参数填充表格数据。