Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据

简介: Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据

前言



学习是自己的事。


但是跟着我学习,也未尝不可。


这种一对多的导出需求,好像确实也是比较常见的:


image.png


表面拒绝,反手上演一手实战示例。


内容:


① 一对多关系数据 (合并单元格)数据的 导出

②一对多关系数据 (合并单元格)数据的 导入

导入导出一块给整了,直接杀死比赛。


(看官们,收藏起来,以后备用。顺手给我点个赞。)


之前写过一篇极其简单的excel导入导出,是单个文件的:


Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入_小目标青年的博客-CSDN博客


还写过一篇单个,多个 excel文件导出,转成ZIP包的:


SpringBoot 导出多个Excel文件,压缩成.zip格式下载_小目标青年的博客-CSDN博客


还有指定模板导出的:

Springboot 指定自定义模板导出Excel文件_小目标青年的博客-CSDN博客_自定义导出excel


正文



模拟一个这种数据的业务场景:


image.png


效果,数据导出:


image.png实战:


先看看工程目录结构:


image.png


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;
}


简析:


image.png


组员的类


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);
    }
}


调用一下看看导出的效果:


image.png


非常OK:


image.png


接下来是导入,写个简单接口玩一下:


数据:


image.png导入 接口代码:

    /**
     * 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("写入数据库");
    }


调用看看效果:


image.pngimage.png


导入成功,就是如此简单。

相关文章
|
13天前
|
Python
使用OpenPyXL库实现Excel单元格其他对齐方式设置
本文介绍了如何使用Python的`openpyxl`库设置Excel单元格中的文本对齐方式,包括文本旋转、换行、自动调整大小和缩进等,通过具体示例代码展示了每种对齐方式的应用方法,适合需要频繁操作Excel文件的用户学习参考。
141 85
使用OpenPyXL库实现Excel单元格其他对齐方式设置
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
131 5
|
1月前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
60 9
|
1月前
|
SQL 数据可视化 数据挖掘
想让Excel表格设计更美观?试试这几款好用工具!
Excel表格设计在项目管理和数据分析中至关重要。本文推荐四款辅助工具:板栗看板、Excel自动图表助手、Think-Cell Chart 和 Power BI,分别在任务管理、图表生成、数据可视化等方面表现突出,帮助你设计出更专业、美观的表格。
71 2
|
1月前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
105 8
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
76 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
存储 easyexcel Java
SpringBoot+EasyExcel轻松实现300万数据快速导出!
本文介绍了在项目开发中使用Apache POI进行数据导入导出的常见问题及解决方案。首先比较了HSSFWorkbook、XSSFWorkbook和SXSSFWorkbook三种传统POI版本的优缺点,然后根据数据量大小推荐了合适的使用场景。接着重点介绍了如何使用EasyExcel处理超百万数据的导入导出,包括分批查询、分批写入Excel、分批插入数据库等技术细节。通过测试,300万数据的导出用时约2分15秒,导入用时约91秒,展示了高效的数据处理能力。最后总结了公司现有做法的不足,并提出了改进方向。
|
2月前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
91 6
|
2月前
|
Web App开发 JavaScript Java
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
这篇文章是关于如何使用Spring Boot整合Elasticsearch,并通过REST客户端操作Elasticsearch,实现一个简单的搜索前后端,以及如何爬取京东数据到Elasticsearch的案例教程。
223 0
elasticsearch学习五:springboot整合 rest 操作elasticsearch的 实际案例操作,编写搜索的前后端,爬取京东数据到elasticsearch中。
|
2月前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
196 0