Springboot 导入导出Excel ,一对多关系,复合表格合并单元格数据
Posted 小目标青年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot 导入导出Excel ,一对多关系,复合表格合并单元格数据相关的知识,希望对你有一定的参考价值。
前言
学习是自己的事。
但是跟着我学习,也未尝不可。
这种一对多的导出需求,好像确实也是比较常见的:
表面拒绝,反手上演一手实战示例。
内容:
① 一对多关系数据 (合并单元格)数据的 导出
②一对多关系数据 (合并单元格)数据的 导入
导入导出一块给整了,直接杀死比赛。
(看官们,收藏起来,以后备用。顺手给我点个赞。)
之前写过一篇极其简单的excel导入导出,是单个文件的:
Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入_小目标青年的博客-CSDN博客
还写过一篇单个,多个 excel文件导出,转成ZIP包的:
SpringBoot 导出多个Excel文件,压缩成.zip格式下载_小目标青年的博客-CSDN博客
还有指定模板导出的:
Springboot 指定自定义模板导出Excel文件_小目标青年的博客-CSDN博客_自定义导出excel
正文
模拟一个这种数据的业务场景:
效果,数据导出:
实战:
先看看工程目录结构:
pom.xml 引入核心依赖:
<dependencies>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-spring-boot-starter</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
这篇文章核心就是使用easypoi 的 注解
@Excel()
合并单元格、复合表格的关键注解
@ExcelCollection()
项目小组类
ProjectGroupExcelVO.java
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import lombok.Data;
import java.util.List;
/**
* @Author: JCccc
* @Description:
* @Date: 1/1/1 1:11
*/
@Data
public class ProjectGroupExcelVO
@Excel(name = "小组名称", needMerge = true, width = 20,height = 8)
private String groupName;
@Excel(name = "小组口号", needMerge = true, width = 20,height = 8)
private String groupSlogan;
@Excel(name = "小组类型", needMerge = true, width = 20,height = 8)
private String groupType;
@ExcelCollection(name = "组员信息")
private List<GroupUserExcelVO> groupUsers;
简析:
组员的类
GroupUserExcelVO.java
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Data;
/**
* @Author: JCccc
* @Description:
* @Date: 1/1/1 1:11
*/
@Data
public class GroupUserExcelVO
@Excel(name = "组员名字", width = 20,height = 8)
private String name;
@Excel(name = "组员电话", width = 20,height = 8)
private String phone;
@Excel(name = "年龄", width = 20,height = 8)
private Integer age;
导入导出工具类一个
MyExcelUtils.java
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.NoSuchElementException;
/**
* @Author: JCccc
* @Description:
* @Date: 1/1/1 1:11
*/
public class MyExcelUtils
/**
* 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
*
* @param list 导出的实体类
* @param title 表头名称
* @param sheetName sheet表名
* @param pojoClass 映射的实体类
* @param fileName
* @param response
* @return
*/
public static void exportExcel( List<?> list, String title, String sheetName, Class<?> pojoClass,
String fileName, HttpServletResponse response)
defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
/**
* 功能描述:默认导出方法
*
* @param list 导出的实体集合
* @param fileName 导出的文件名
* @param pojoClass pojo实体
* @param exportParams ExportParams封装实体
* @param response
* @return
*/
private static void defaultExport( List<?> list, Class<?> pojoClass, String fileName,
HttpServletResponse response, ExportParams exportParams)
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
if (workbook != null)
downLoadExcel(fileName, response, workbook);
/**
* 功能描述:Excel导出
*
* @param fileName 文件名称
* @param response
* @param workbook Excel对象
* @return
*/
private static void downLoadExcel( String fileName, HttpServletResponse response,
Workbook workbook)
try
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "multipart/form-data");
response.setHeader("Content-Disposition",
"attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
workbook.write(response.getOutputStream());
catch (IOException e)
throw new RuntimeException(e);
/**
* 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
*
* @param file 上传的文件
* @param titleRows 表标题的行数
* @param headerRows 表头行数
* @param pojoClass Excel实体类
* @return
*/
public static <T> List<T> importExcel( MultipartFile file, Integer titleRows, Integer headerRows,
Class<T> pojoClass)
if (file == null)
return null;
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
List<T> list = null;
try
list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
catch (NoSuchElementException e)
throw new RuntimeException("excel文件不能为空");
catch (Exception e)
throw new RuntimeException(e.getMessage());
return list;
导出接口:
TestController.java
import com.jc.excel.excelVO.GroupUserExcelVO;
import com.jc.excel.excelVO.ProjectGroupExcelVO;
import com.jc.excel.util.MyExcelUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: JCccc
* @Description:
* @Date: 1/1/1 1:11
*/
@RestController
public class TestController
/**
* excel导出
*
* @return
*/
@GetMapping(value = "/exportTest")
public void export(HttpServletResponse response)
List<ProjectGroupExcelVO> projectGroupList=new ArrayList<>();
//小组A数据模拟
ProjectGroupExcelVO groupA=new ProjectGroupExcelVO();
groupA.setGroupName("小组A");
groupA.setGroupSlogan("天天向上,爱学习!");
groupA.setGroupType("奋斗类型");
List<GroupUserExcelVO> groupUserAList=new ArrayList<>();
GroupUserExcelVO groupUser1=new GroupUserExcelVO();
groupUser1.setName("小收");
groupUser1.setPhone("123456");
groupUser1.setAge(18);
GroupUserExcelVO groupUser2=new GroupUserExcelVO();
groupUser2.setName("小藏");
groupUser2.setPhone("654321");
groupUser2.setAge(20);
groupUserAList.add(groupUser1);
groupUserAList.add(groupUser2);
groupA.setGroupUsers(groupUserAList);
//小组B数据模拟
ProjectGroupExcelVO groupB=new ProjectGroupExcelVO();
groupB.setGroupName("小组B");
groupB.setGroupSlogan("跟着JC学java,稳!");
groupB.setGroupType("努力类型");
List<GroupUserExcelVO> groupBUserBList=new ArrayList<>();
GroupUserExcelVO groupUserB1=new GroupUserExcelVO();
groupUserB1.setName("小点");
groupUserB1.setPhone("123456");
groupUserB1.setAge(12);
GroupUserExcelVO groupUserB2=new GroupUserExcelVO();
groupUserB2.setName("小赞");
groupUserB2.setPhone("654321");
groupUserB2.setAge(15);
GroupUserExcelVO groupUserB3=new GroupUserExcelVO();
groupUserB3.setName("JCccc");
groupUserB3.setPhone("136919xxxxx");
groupUserB3.setAge(10000);
groupBUserBList.add(groupUserB1);
groupBUserBList.add(groupUserB2);
groupBUserBList.add(groupUserB3);
groupB.setGroupUsers(groupBUserBList);
projectGroupList.add(groupA);
projectGroupList.add(groupB);
String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss"));
MyExcelUtils.exportExcel(projectGroupList,
"小组信息",
"小组信息",
ProjectGroupExcelVO.class,
"小组信息文件"+time+".xls",response);
调用一下看看导出的效果:
非常OK:
接下来是导入,写个简单接口玩一下:
数据:
导入 接口代码:
/**
* excel导入
*
* @return
*/
@PostMapping(value = "/importTest")
public void importTest( @RequestParam("file") MultipartFile file)
List<ProjectGroupExcelVO> projectGroupExcelVOList = MyExcelUtils.importExcel(file, 1, 2, ProjectGroupExcelVO.class);
System.out.println(projectGroupExcelVOList.toString());
System.out.println("-----------------------------------");
System.out.println("写入数据库");
调用看看效果:
导入成功,就是如此简单。
SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」
摘自:https://www.cnblogs.com/bingyang-py/p/12407675.html
有天上飞的概念,就要有落地的实现
SpringBoot 图文教程系列文章目录
- SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」
- SpringBoot图文教程2—日志的使用「logback」「log4j」
- SpringBoot图文教程3—「‘初恋’情结」集成Jsp
- SpringBoot图文教程4—SpringBoot 实现文件上传下载
- SpringBoot图文教程5—SpringBoot 中使用Aop
- SpringBoot图文教程6—SpringBoot中过滤器的使用
- SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有
- SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」
前言
Excel文件的导入导出功能,在项目中可以说是一个极其常见的功能了,使用到这技术的业务场景也非常多,例如:客户信息的导入导出,运营数据的导入导出,订单数据的导入导出等等。
那么在 SpringBoot 中如何使用 Poi 呢?从本文开始将会说三种使用 Poi 的姿势:Apache Poi,EasyPoi,阿里开源的EasyExcel。
话不多说,马上开始。
集成 Poi
什么是 Poi
Apache Poi 是 Apache 的一个开源项目,用Java代码通过 poi 技术可以实现 读取 和 生成 Excel 文档。
关于 Poi 的简介非常的少,接下来我们简单说一些和Excel相关的常识
-
通过 office Excel软件或者 wps 常用的Excel格式有两种:xls 和 xlsx
-
上图中的两个文件都是Excel文件,在一个Excel文件中包含若干张表
-
一张表中可以分为很多行 row ,每行又分为很多单元格 cell
Poi 对 Excel 抽象出来的对象
刚才简单的说过了Excel文件相关的情况,但是那是在电脑中使用Excel需要用到的东西,如果要通过 SpringBoot 导入导入 Excel 文件,就要通过类和方法来进行。
于是在 Poi 中对以上提到的所有的名词都做了一定的封装。对应关系如下:
Excel 文件 |
HSSFWorkbook (xls)XSSFWorkbook(xlsx) |
Excel 的工作表 |
HSSFSheet |
Excel 的行 |
HSSFRow |
Excel 中的单元格 |
HSSFCell |
Excel 字体 |
HSSFFont |
Excel 单元格样式 |
HSSFCellStyle |
Excel 颜色 |
HSSFColor |
合并单元格 |
CellRangeAddress |
Poi 的基本使用
要导出的实体类 如下:
1. 在项目中导入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.14</version>
</dependency>
2. 在测试类中写导出的代码如下:
生成的Excel文件如下
3. Excel导入
总结
Tips:本文只讲解了 Poi 最基本的使用方式 如果需要其他更加全面的使用方式
可以关注后续文章 Easypoi 和 EasyExcel 以及 Poi中文 API 文档 「40种操作 Excel文件的姿势」
恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。
让我们再次回顾本文的学习目标
要掌握SpringBoot更多的用法,请持续关注本系列教程。
求关注,求点赞,求转发
欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。
以上是关于Springboot 导入导出Excel ,一对多关系,复合表格合并单元格数据的主要内容,如果未能解决你的问题,请参考以下文章
微服务 Spring Boot Mybatis-Plus 整合 EasyPOI 实现 Excel 一对多 导入
Springboot整合easyExcel导入导出Excel
java导入excel时怎么判断excel文件
SpringBoot+easypoi实现excel的导入导出
springboot结合POI导入导出excel文件
【springboot+easypoi】一行代码搞定excel导入导出