一、前言

当前我使用过的导入导出框架有EasyPoi 和 EasyExcel,我用EasyPoi比较多。

EasyPoi 框架的导入导出功能,乃至复杂表头的导入导出,网上都有很多示例,我也写过几篇博客,其官方文档也很详细,功能强大。其官方文档地址经常访问不了,可以参考这个。

风铃开源文档-旧版 (afterturn.cn)https://opensource.afterturn.cn/doc/easypoi.html

EasyExcel 框架是阿里巴巴团队开发导入导出框架,相较而言,EasyExcel要轻量简单高效一些。网上的示例也相对较少,胜在官网稳定简洁。EasyExcel · 语雀 (yuque.com)https://www.yuque.com/easyexcel/doc/easyexcel最近,我在写EasyExcel框架的一对多的导入功能,官方文档和网上都没有详细的说明,搞了半天,在此记录一下。

说明:EasyExcel无法做到自动给我们处理成类里面嵌套List的效果,这就需要我们通过直接的方式先拿到数据,然后自行在service层处理。EasyPoi则有对应的注解和方法可以实现。

二、EasyExcel一对多导入实现

2.1 模板样式

2.2 Entity对象

@Data
@ToString
public class CustomerExcel implements Serializable {/*** 客户编号*/@ExcelProperty(index = 0)private String customerCode;/*** 客户名称*/@ExcelProperty(index = 1)private String customerName;/*** 客户所在地*/@ExcelProperty(index = 2)private String address;/*** 联系人姓名*/@ExcelProperty(index = 3)private String personName;/*** 联系电话*/@ExcelProperty(index = 4)private String personPhone;/*** 联系人姓名及电话List* 这个是需要我们自己整理的,EasyExcel做不到**/@ExcelIgnoreprivate List<Map<String, String>> contactsList;}

2.3 Contorller 层

@PostMapping("/import")
@ApiOperation("导入客户信息列表")
@ApiImplicitParam(name = "file", value = "导入的Excel文件", dataType = "File", paramType = "form", required = true)
public ResponseMsg importCustomer(@RequestParam(value = "file") MultipartFile file) throws Exception {InputStream inputStream = file.getInputStream();List<CustomerExcel> list = EasyExcel.read(inputStream).headRowNumber(2).head(CustomerExcel.class).sheet().doReadSync();ResponseMsg responseMsg = new ResponseMsg();if (list == null || list.size() == 0) {responseMsg.setCode(MsgCode.Error.value());responseMsg.setDesc("导入失败,没有读取到导入数据!");return responseMsg;} else {// service层return customerService.importCustomer(list);}
}// 注意,我们在这里拿到的list数据是有问题,合并的单元格就一个单元格有数据,其他没有,所以需要在service层再做处理。

2.4 Service 层

/*** 导入客户基本信息*/
@Override
public ResponseMsg importCustomer(List<CustomerExcel> list) {// 待保存到数据库的数据List<CustomerExcel> data = new ArrayList<>();// 客户信息CustomerExcel customer = new CustomerExcel();// 客户联系人信息List<Map<String, String>> contactsList = new ArrayList<>();for (CustomerExcel obj : list) {// 判断客户编号和客户名称是否为空if (StringUtil.isNotBlank(obj.getCustomerCode()) && StringUtil.isNotBlank(obj.getCustomerName())) {// 联系人信息列表是否有数据,如果有则要把数据保存起来if (contactsList.size() != 0) {customer.setContactsList(contactsList);data.add(customer);}// 重置客户和联系人列表对象customer = new CustomerExcel();contactsList = new ArrayList<>();customer.setCustomerName(obj.getCustomerName());customer.setCustomerCode(obj.getCustomerCode());customer.setAddress(obj.getAddress());Map map = new HashMap(4);map.put("name", obj.getPersonName());map.put("phone", obj.getPersonPhone());contactsList.add(map);// 如果客户编码和客户名称为空,则只拿联系人信息即可} else {Map map = new HashMap(4);map.put("name", obj.getPersonName());map.put("phone", obj.getPersonPhone());contactsList.add(map);}}// 保存最后一条数据if (contactsList.size() != 0) {customer.setContactsList(contactsList);data.add(customer);}// 保存,或做其他处理。customerMapper.insertBatch(data);return new ResponseMsg();}

EasyExcel复杂表头导出(一对多)升级版,博客地址:

https://blog.csdn.net/qq_41057885/article/details/126411957

EasyExcel复杂表头导入(一对多)相关推荐

  1. EasyExcel复杂excel导入

    EasyExcel复杂excel导入 easyexcel官方都是一些简单的导入到处示例,复杂的excel文档导入,还得自己去慢慢琢磨.百度.思考.总结.学习.观察. 代码地址在文档的最后,如果你也遇到 ...

  2. SpringBoot中使用Easyexcel实现Excel导入导出功能(三)

    导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少.通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.co ...

  3. SpringBoot中使用Easyexcel实现Excel导入导出功能(一)

    目录 前言 1.常规导入 2.读取到指定的列 3.读取全部的sheet页 4.日期.数字及其他自定义格式的转换 5.表头有多行的表格读取 6.表头数据的读取 7.单元格内的备注内容读取 前言 exce ...

  4. easyexcel导出和导入

    首先导jar包 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</ ...

  5. EasyExcel 动态表头 + 数据单元格合并

    前言 本文想要达到以及最终实现的效果: 要实现这种效果,包含两个部分的操作: 1. 动态表头 EasyExcel 生成 Excel 时要使表头有合并效果,可以采用**注解和非注解(动态表头)**的方法 ...

  6. easyexcel 复杂表头、动态表头、复杂数据导出(非注解方式)

    easyexcel 复杂表头.动态表头.复杂数据导出 easyexcel 生成动态复杂表头(非注解)+数据填充(非注解) 实现代码 生成效果图 easyexcel 生成动态复杂表头(非注解)+数据填充 ...

  7. EasyExcel自定义表头导出模板并封装数据下拉选择

    EasyExcel自定义表头导出模板 首先查询可变数据 动态数据Controller 表头封装 定义导出模板时的下拉数据 最终结果 首先查询可变数据 动态数据Controller @ApiOperat ...

  8. easyExcel的复杂表头多级表头导入

    easyExcel导入相关 首先要了解 easyExcel怎么获取表头 直接贴代码就不废话了 下面导入文件一块的代码 有的人说 如果我是不固定的表头怎么办呢? 首先要了解 easyExcel怎么获取表 ...

  9. 4. java使用easyexcel导入excel-多个sheet页、每个sheet页存在多个表头导入的情况、踩坑记录、可在线拉取成品demo、也可参详详细演示流程、贴心手把手操作

    文章目录 1.EXCEL模板数据格式.导入结果展示 2.避坑防雷招待所[♥] 2.1.与poi-Jar包文件版本冲突 2.2.传入后台读取文件流报空指针 3.在线获取代码及模板 3.1.Github获 ...

最新文章

  1. dom4j生成、解析xml
  2. 配置Log4j(非常具体)
  3. 选择日期保存报错Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String......
  4. 三步彻底清除电脑的mysql
  5. php自动打印小票_服装店专用小票机自带进销存
  6. ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】
  7. 08TensorFlow2.0基础--8.4部分采样
  8. 计算机网络网络层之数据报网络
  9. python安装包国内地址
  10. 提供SCDN基础版本售卖
  11. 代码质量(权威精选植根于开发实践的最佳读物)
  12. 红帽linux系统服务器下载,redhat linux 下载地址大全 完全整理
  13. 数据结构实训——哈希表设计
  14. 金融分析与风险管理——投资组合的绩效评估
  15. PRCV2018美图短视频实时分类挑战赛落幕,第一名解决方案技术解读
  16. h3c 抓包么 能通过debug_H3C debugging 使用技巧
  17. linux系统怎么关闭屏保,Linux关闭屏保
  18. 软件图形用户界面设计
  19. CCF系列题解--2018年3月第三题 URL映射
  20. rpmbuild告警mangling shebang in xxx from /bin/python to /usr/bin/python/python2.

热门文章

  1. IDEA配置.gitignore
  2. office2010密钥
  3. java localstorage_localStorage使用总结
  4. 如何清除Windows木马?
  5. 图解奇偶校验与海明码的详细过程
  6. windows服务器远程管理
  7. python重启路由器_linux下的python里面如何用相关的网络模块来重启tp-link路由器?...
  8. 智能路由器操作系统openwrt 之三 音频开发
  9. 破碎搭建_当一切都破碎了
  10. ES6之for...of和for...in