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图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

 

有天上飞的概念,就要有落地的实现

  • 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍

  • 先赞后看,养成习惯

SpringBoot 图文教程系列文章目录

  1. SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」
  2. SpringBoot图文教程2—日志的使用「logback」「log4j」
  3. SpringBoot图文教程3—「‘初恋’情结」集成Jsp
  4. SpringBoot图文教程4—SpringBoot 实现文件上传下载
  5. SpringBoot图文教程5—SpringBoot 中使用Aop
  6. SpringBoot图文教程6—SpringBoot中过滤器的使用
  7. SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有
  8. SpringBoot图文教程8 — SpringBoot集成MBG「代码生成器」

前言

Excel文件的导入导出功能,在项目中可以说是一个极其常见的功能了,使用到这技术的业务场景也非常多,例如:客户信息的导入导出,运营数据的导入导出,订单数据的导入导出等等。

那么在 SpringBoot 中如何使用 Poi 呢?从本文开始将会说三种使用 Poi 的姿势:Apache Poi,EasyPoi,阿里开源的EasyExcel。

话不多说,马上开始。

集成 Poi

什么是 Poi

Apache Poi 是 Apache 的一个开源项目,用Java代码通过 poi 技术可以实现 读取 和 生成 Excel 文档。

关于 Poi 的简介非常的少,接下来我们简单说一些和Excel相关的常识

  1. 通过 office Excel软件或者 wps 常用的Excel格式有两种:xls 和 xlsx

  2. 上图中的两个文件都是Excel文件,在一个Excel文件中包含若干张表

  3. 一张表中可以分为很多行 row ,每行又分为很多单元格 cell

Poi 对 Excel 抽象出来的对象

刚才简单的说过了Excel文件相关的情况,但是那是在电脑中使用Excel需要用到的东西,如果要通过 SpringBoot 导入导入 Excel 文件,就要通过类和方法来进行。

于是在 Poi 中对以上提到的所有的名词都做了一定的封装。对应关系如下:

Excel中的概念Poi对应的对象
Excel 文件 HSSFWorkbook (xls)XSSFWorkbook(xlsx)
Excel 的工作表 HSSFSheet
Excel 的行 HSSFRow
Excel 中的单元格 HSSFCell
Excel 字体 HSSFFont
Excel 单元格样式 HSSFCellStyle
Excel 颜色 HSSFColor
合并单元格 CellRangeAddress

Poi 的基本使用

要导出的实体类 如下:
image.png

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. 在测试类中写导出的代码如下:


    /**
     * 导出数据
     */
    @Test
    public void test2() throws IOException {
//        0.准备数据
        User user = new User();
        user.setUserId(1);
        user.setUserName("hhhh");
        user.setUserSex("男");

        String[] titles = {"编号","名字","性别"};

        /**
         * 先写入 标题栏数据
         */
//        1.创建文件对象   创建HSSFWorkbook只能够写出为xls格式的Excel
//        要写出 xlsx 需要创建为 XSSFWorkbook 两种Api基本使用方式一样
        HSSFWorkbook workbook = new HSSFWorkbook();

//        2.创建表对象
        HSSFSheet sheet = workbook.createSheet("users");

//        3.创建标题栏(第一行)  参数为行下标  行下标从0开始
        HSSFRow titleRow = sheet.createRow(0);

//        4.在标题栏中写入数据
        for (int i = 0; i < titles.length; i++) {
//            创建单元格
            HSSFCell cell = titleRow.createCell(i);
            cell.setCellValue(titles[i]);
        }
        /**
         * 写入用户数据
         */
//       5 创建行 如果是用户数据的集合 需要遍历
         HSSFRow row = sheet.createRow(1);

//       6 将用户数据写入到行中
        row.createCell(0).setCellValue(user.getUserId());
        row.createCell(1).setCellValue(user.getUserName());
        row.createCell(2).setCellValue(user.getUserSex());

//        文件保存到本地 参数为要写出的位置
        workbook.write(new FileOutputStream("/Users/k/Desktop/hhh.xls"));

    }

生成的Excel文件如下

3. Excel导入

  /**
     * 文件导入  实际上就是文件导出反向操作
     */
    @Test
    public void test3() throws Exception {
//        1.通过流读取Excel文件
        FileInputStream inputStream = new FileInputStream("/Users/k/Desktop/hhh.xls");
//        2.通过poi解析流 HSSFWorkbook 处理流得到的对象中 就封装了Excel文件所有的数据
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
//        3.从文件中获取表对象  getSheetAt通过下标获取
        HSSFSheet sheet = workbook.getSheetAt(0);
//        4.从表中获取到行数据  从第二行开始 到 最后一行  getLastRowNum() 获取最后一行的下标
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 1; i <= lastRowNum; i++) {
//            通过下标获取行
            HSSFRow row = sheet.getRow(i);
//            从行中获取数据

            /**
             * getNumericCellValue() 获取数字
             * getStringCellValue 获取String
             */
            double id = row.getCell(0).getNumericCellValue();
            String name = row.getCell(1).getStringCellValue();
            String sex = row.getCell(2).getStringCellValue();

//            封装到对象中
            User user = new User();
            user.setUserId((int) id);
            user.setUserName(name);
            user.setUserSex(sex);

//            将对象添加数据库
            System.out.println(user);
        }
    }

总结

Tips:本文只讲解了 Poi 最基本的使用方式 如果需要其他更加全面的使用方式

可以关注后续文章 Easypoi 和 EasyExcel 以及 Poi中文 API 文档 「40种操作 Excel文件的姿势」

恭喜你完成了本章的学习,为你鼓掌!如果本文对你有帮助,请帮忙点赞,评论,转发,这对作者很重要,谢谢。

让我们再次回顾本文的学习目标

  • 掌握SpringBoot中Poi的使用

要掌握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导入导出