客户管理系统开发定制Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据

前言

客户管理系统开发定制学习是自己的事。

客户管理系统开发定制但是跟着我学习,客户管理系统开发定制也未尝不可。

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

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

内容:



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

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

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

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

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


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


 

还有指定模板导出的:


正文

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

效果,数据导出:
 

实战:
 

先看看工程目录结构:

pom. 引入核心依赖:
 

  1. <dependencies>
  2. <dependency>
  3. <groupId>cn.afterturn</groupId>
  4. <artifactId>easypoi-spring-boot-starter</artifactId>
  5. <version>4.1.3</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.projectlombok</groupId>
  9. <artifactId>lombok</artifactId>
  10. <version>1.18.10</version>
  11. <scope>provided</scope>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-web</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-test</artifactId>
  20. <scope>test</scope>
  21. </dependency>
  22. </dependencies>

这篇文章核心就是使用easypoi 的 注解

@Excel()

合并单元格、复合表格的关键注解 

@ExcelCollection()

项目小组类

ProjectGroupExcelVO.java

  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
  3. import lombok.Data;
  4. import java.util.List;
  5. /**
  6. * @Author: JCccc
  7. * @Description:
  8. * @Date: 1/1/1 1:11
  9. */
  10. @Data
  11. public class ProjectGroupExcelVO {
  12. @Excel(name = "小组名称", needMerge = true, width = 20,height = 8)
  13. private String groupName;
  14. @Excel(name = "小组口号", needMerge = true, width = 20,height = 8)
  15. private String groupSlogan;
  16. @Excel(name = "小组类型", needMerge = true, width = 20,height = 8)
  17. private String groupType;
  18. @ExcelCollection(name = "组员信息")
  19. private List<GroupUserExcelVO> groupUsers;
  20. }

简析:

组员的类

GroupUserExcelVO.java

  1. import cn.afterturn.easypoi.excel.annotation.Excel;
  2. import lombok.Data;
  3. /**
  4. * @Author: JCccc
  5. * @Description:
  6. * @Date: 1/1/1 1:11
  7. */
  8. @Data
  9. public class GroupUserExcelVO {
  10. @Excel(name = "组员名字", width = 20,height = 8)
  11. private String name;
  12. @Excel(name = "组员电话", width = 20,height = 8)
  13. private String phone;
  14. @Excel(name = "年龄", width = 20,height = 8)
  15. private Integer age;
  16. }

导入导出工具类一个

MyExcelUtils.java

  1. import cn.afterturn.easypoi.excel.ExcelExportUtil;
  2. import cn.afterturn.easypoi.excel.ExcelImportUtil;
  3. import cn.afterturn.easypoi.excel.entity.ExportParams;
  4. import cn.afterturn.easypoi.excel.entity.ImportParams;
  5. import org.apache.poi.ss.usermodel.Workbook;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import javax.servlet.http.HttpServletResponse;
  8. import java.io.IOException;
  9. import java.net.URLEncoder;
  10. import java.util.List;
  11. import java.util.NoSuchElementException;
  12. /**
  13. * @Author: JCccc
  14. * @Description:
  15. * @Date: 1/1/1 1:11
  16. */
  17. public class MyExcelUtils {
  18. /**
  19. * 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
  20. *
  21. * @param list 导出的实体类
  22. * @param title 表头名称
  23. * @param sheetName sheet表名
  24. * @param pojoClass 映射的实体类
  25. * @param fileName
  26. * @param response
  27. * @return
  28. */
  29. public static void exportExcel( List<?> list, String title, String sheetName, Class<?> pojoClass,
  30. String fileName, HttpServletResponse response) {
  31. defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
  32. }
  33. /**
  34. * 功能描述:默认导出方法
  35. *
  36. * @param list 导出的实体集合
  37. * @param fileName 导出的文件名
  38. * @param pojoClass pojo实体
  39. * @param exportParams ExportParams封装实体
  40. * @param response
  41. * @return
  42. */
  43. private static void defaultExport( List<?> list, Class<?> pojoClass, String fileName,
  44. HttpServletResponse response, ExportParams exportParams) {
  45. Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
  46. if (workbook != null) {
  47. downLoadExcel(fileName, response, workbook);
  48. }
  49. }
  50. /**
  51. * 功能描述:Excel导出
  52. *
  53. * @param fileName 文件名称
  54. * @param response
  55. * @param workbook Excel对象
  56. * @return
  57. */
  58. private static void downLoadExcel( String fileName, HttpServletResponse response,
  59. Workbook workbook) {
  60. try {
  61. response.setCharacterEncoding("UTF-8");
  62. response.setHeader("content-Type", "multipart/form-data");
  63. response.setHeader("Content-Disposition",
  64. "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  65. workbook.write(response.getOutputStream());
  66. } catch (IOException e) {
  67. throw new RuntimeException(e);
  68. }
  69. }
  70. /**
  71. * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
  72. *
  73. * @param file 上传的文件
  74. * @param titleRows 表标题的行数
  75. * @param headerRows 表头行数
  76. * @param pojoClass Excel实体类
  77. * @return
  78. */
  79. public static <T> List<T> importExcel( MultipartFile file, Integer titleRows, Integer headerRows,
  80. Class<T> pojoClass) {
  81. if (file == null) {
  82. return null;
  83. }
  84. ImportParams params = new ImportParams();
  85. params.setTitleRows(titleRows);
  86. params.setHeadRows(headerRows);
  87. List<T> list = null;
  88. try {
  89. list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
  90. } catch (NoSuchElementException e) {
  91. throw new RuntimeException("excel文件不能为空");
  92. } catch (Exception e) {
  93. throw new RuntimeException(e.getMessage());
  94. }
  95. return list;
  96. }
  97. }

导出接口:

TestController.java

  1. import com.jc.excel.excelVO.GroupUserExcelVO;
  2. import com.jc.excel.excelVO.ProjectGroupExcelVO;
  3. import com.jc.excel.util.MyExcelUtils;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.time.LocalDateTime;
  8. import java.time.format.DateTimeFormatter;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * @Author: JCccc
  13. * @Description:
  14. * @Date: 1/1/1 1:11
  15. */
  16. @RestController
  17. public class TestController {
  18. /**
  19. * excel导出
  20. *
  21. * @return
  22. */
  23. @GetMapping(value = "/exportTest")
  24. public void export(HttpServletResponse response) {
  25. List<ProjectGroupExcelVO> projectGroupList=new ArrayList<>();
  26. //小组A数据模拟
  27. ProjectGroupExcelVO groupA=new ProjectGroupExcelVO();
  28. groupA.setGroupName("小组A");
  29. groupA.setGroupSlogan("天天向上,爱学习!");
  30. groupA.setGroupType("奋斗类型");
  31. List<GroupUserExcelVO> groupUserAList=new ArrayList<>();
  32. GroupUserExcelVO groupUser1=new GroupUserExcelVO();
  33. groupUser1.setName("小收");
  34. groupUser1.setPhone("123456");
  35. groupUser1.setAge(18);
  36. GroupUserExcelVO groupUser2=new GroupUserExcelVO();
  37. groupUser2.setName("小藏");
  38. groupUser2.setPhone("654321");
  39. groupUser2.setAge(20);
  40. groupUserAList.add(groupUser1);
  41. groupUserAList.add(groupUser2);
  42. groupA.setGroupUsers(groupUserAList);
  43. //小组B数据模拟
  44. ProjectGroupExcelVO groupB=new ProjectGroupExcelVO();
  45. groupB.setGroupName("小组B");
  46. groupB.setGroupSlogan("跟着JC学java,稳!");
  47. groupB.setGroupType("努力类型");
  48. List<GroupUserExcelVO> groupBUserBList=new ArrayList<>();
  49. GroupUserExcelVO groupUserB1=new GroupUserExcelVO();
  50. groupUserB1.setName("小点");
  51. groupUserB1.setPhone("123456");
  52. groupUserB1.setAge(12);
  53. GroupUserExcelVO groupUserB2=new GroupUserExcelVO();
  54. groupUserB2.setName("小赞");
  55. groupUserB2.setPhone("654321");
  56. groupUserB2.setAge(15);
  57. GroupUserExcelVO groupUserB3=new GroupUserExcelVO();
  58. groupUserB3.setName("JCccc");
  59. groupUserB3.setPhone("136919xxxxx");
  60. groupUserB3.setAge(10000);
  61. groupBUserBList.add(groupUserB1);
  62. groupBUserBList.add(groupUserB2);
  63. groupBUserBList.add(groupUserB3);
  64. groupB.setGroupUsers(groupBUserBList);
  65. projectGroupList.add(groupA);
  66. projectGroupList.add(groupB);
  67. String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss"));
  68. MyExcelUtils.exportExcel(projectGroupList,
  69. "小组信息",
  70. "小组信息",
  71. ProjectGroupExcelVO.class,
  72. "小组信息文件"+time+".xls",response);
  73. }
  74. }

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

 非常OK:

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

数据:

导入 接口代码:
 

  1. /**
  2. * excel导入
  3. *
  4. * @return
  5. */
  6. @PostMapping(value = "/importTest")
  7. public void importTest( @RequestParam("file") MultipartFile file) {
  8. List<ProjectGroupExcelVO> projectGroupExcelVOList = MyExcelUtils.importExcel(file, 1, 2, ProjectGroupExcelVO.class);
  9. System.out.println(projectGroupExcelVOList.toString());
  10. System.out.println("-----------------------------------");
  11. System.out.println("写入数据库");
  12. }

调用看看效果:

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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发