文章目录

  • 背景知识介绍
    • 有数据对象读方式
      • 创建类实现ReadListener
      • 无额外实现类,since: 3.0.0-beta1
    • 不创建数据对象读方式
  • 实践
    • 思路
      • 抽象监听类
      • 抽象业务处理类
      • 具体业务处理类
    • web整合
  • 后记

可能最近和easyexcel比较有缘,上个月倒腾了导出,这个月就轮到了导入了~~
    Excel读取实际上是很复杂的,比如问卷场景,涉及多级表头、不固定的列、各类格式(时间、数值等等),但是不用怕,这些在 官方网站上都能找到案例!
    本文主要讲解web版不创建对象的导入excel通用版,解决了表格内容不固定和各个导入业务模块复用性!

背景知识介绍

本篇项目框架介绍:SpringBoot + MybatisPlus + EasyExcel + Knife4j

有数据对象读方式

创建类实现ReadListener

实现步骤为:

  1. 定义数据对象DemoData,与Excel中row的每一列对应上
  2. 定义监听器 implements ReadListener,将每一行映射到List<DemoData>
  3. 根据业务,存储List<DemoData>

无额外实现类,since: 3.0.0-beta1

划重点:easyexcel版本需要在3.0.0-beta1及以上!!!
如下代码为:官方举例,其中DemoData为定义的数据对象,与Excel中的列对应。

 String fileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭// 这里每次会读取100条数据 然后返回过来 直接调用使用数据就行EasyExcel.read(fileName, DemoData.class, new PageReadListener<DemoData>(dataList -> {for (DemoData demoData : dataList) {log.info("读取到一条数据{}", JSON.toJSONString(demoData));}})).sheet().doRead();

不创建数据对象读方式

实现步骤为:

  1. 定义监听器extends AnalysisEventListener<Map<Integer, String>>
  2. 定义全局变量Map<Integer, String> cachedDataList,将读取的每一行数据存储在该变量中
  3. 根据业务,存储cachedDataList

实践

思路

  1. 定义抽象监听器AbstractNoModelDataListener实现AnalysisEventListener<Map<Integer, String>>,构造函数中将业务处理接口及业务上下文参数初始化
  2. 定义抽象业务处理类AbstractImportInterface,作为业务处理统一入口
  3. 定义具体业务处理类实现AbstractImportInterface

抽象监听类

package com.lizzy.common.excel.utils;import java.util.List;
import java.util.Map;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.google.common.collect.Lists;import lombok.extern.slf4j.Slf4j;/*** EasyExcel不创建数据对象的读*/
@Slf4j
public class AbstractNoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {/*** 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收*/private static final int BATCH_COUNT = 5;private List<Map<Integer, String>> cachedDataList = Lists.newArrayListWithExpectedSize(BATCH_COUNT);private AbstractImportInterface importInterface;private Map<String, Object> params;/*** 初始化业务处理的service层和其他业务参数* @param importInterface 处理业务的service层* @param params 其他业务参数*/public AbstractNoModelDataListener(AbstractImportInterface importInterface, Map<String, Object> params) {this.importInterface = importInterface;this.params = params;}// 默认跳过第一行(通常情况下第一行为标题栏)@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {// 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据// 若有跳过行数需求,可写个钩子进行处理
//      context.getCurrentRowNum()log.debug("解析到一条数据:{}", data.toString());cachedDataList.add(data);if (cachedDataList.size() >= BATCH_COUNT) {saveData();cachedDataList = Lists.newArrayListWithExpectedSize(BATCH_COUNT);}}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {saveData();log.info("所有数据解析完成!");}/*** 加上存储数据库*/private void saveData() {log.info("{}条数据,开始存储数据库!", cachedDataList.size());importInterface.save(params, cachedDataList);log.info("存储数据库成功!");}
}

抽象业务处理类

package com.lizzy.common.excel.utils;import java.util.List;
import java.util.Map;/*** 导入excel时,抽象业务处理层*/
public interface AbstractImportInterface {/*** 业务层存储excel数据逻辑* @param params 业务上下文参数* @param data 表格row数据*/void save(Map<String, Object> params, List<Map<Integer, String>> data);}

具体业务处理类

因涉及项目私密性,此处为伪代码,请各位看官自行实现。

package com.lizzy.service;import com.lizzy.common.excel.utils.AbstractImportInterface;import lombok.extern.slf4j.Slf4j;@Slf4j
@Service
public class UserImportService implements AbstractImportInterface {@AutowiredIUserService iUserService;@Overridepublic void save(Map<String, Object> params, List<Map<Integer, String>> data) {// 获取上下文参数       final String key = String.valueOf(params.get("key"));// 业务判断逻辑,此处伪代码,请自行实现iUserService.save(key, data);}
}

web整合

说明:ResponseVoResultUtil为项目定义的通用返回对象,可自行替换!

package com.lizzy.controller;import java.io.IOException;
import java.util.HashMap;
import java.util.Map;import javax.validation.Valid;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import com.lizzy.common.ResponseVo;
import com.lizzy.common.excel.utils.AbstractNoModelDataListener;
import com.lizzy.common.util.ResultUtil;
import com.lizzy.service.IUserService;import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;/*** 平台端-问卷数据管理**/
@RestController
@RequestMapping(value = { "/test" })
@Validated
@Api(tags = "测试数据")
@SuppressWarnings({ "unchecked" })
@Slf4j
public class TestController {@AutowiredIUserService iUserService;@ApiOperation(value = "导入数据")@PostMapping(value = "/importData")public ResponseVo<?> importData(@ApiParam(value = "key", required = true) @Valid @RequestParam String key,@RequestParam(value = "file", required = false) MultipartFile file) {try {Map<String, Object> params = new HashMap<String, Object>();params.put("key", key);// 同步的返回,不推荐使用,如果数据量大会把数据放到内存里面
//          EasyExcel.read(file.getInputStream()).sheet().doReadSync();EasyExcel.read(file.getInputStream(), new AbstractNoModelDataListener(iUserService, params)).sheet().doRead();return ResultUtil.success();} catch (IOException e) {log.info("导入数据excel失败!", e.getMessage());return ResultUtil.error("导入数据excel失败!");}}}

后记

记录一次通用导入模块诞生记,欢迎大家踊跃提出问题,一起学习,一起进步!!!

springboot easyexcel不创建对象导入excel 通用版相关推荐

  1. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1X9Sl4bWTNHJOJb_v-KUndA  ...

  2. Springboot+Vue实现在线聊天(通用版)

    只需简单几步,就可以实现在线聊天室! 集成步骤: 后端Springboot Springboot 添加Pom依赖: <!-- websocket --> <dependency> ...

  3. c 导入oracle数据库,c导入excel数据到数据库

    报表工具如何实现多次导入Excel 很多人在开发报表的时候会遇到将多张表样相同的excel导入到模板,然后提交至数据库中.但问题是很多情况,在线导入不支持一次性选择多个excel,一次只能选择一个ex ...

  4. 基于SpringBoot+EasyExcel+vue3实现excel表格的导入和导出

    目录 基于SpringBoot+EasyExcel+vue3实现excel表格的导入和导出 一.导入和导出 二.导出数据为excel实现过程 三.将excel中的数据导入到数据库中 基于SpringB ...

  5. 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合toke ...

  6. easyExcel 导入Excel数据

    easyExcel 导入Excel数据 最近公司项目需要导入几十万的Excel数据,我这里用的是现在最流行的easyExcel, 希望能帮助到你 首先导入jar包 <dependency> ...

  7. java怎么导入到安卓手机,android导入excel表格数据-随手记记账记录如何导出到EXCEL(安卓版)...

    excel数据导入到android项目下的sqlite数据库中 把excel的数据读入到程序里. 这个就是用java读取excel的数据,百度一下就有很多成熟的例子. 把程序的数据存入sqllite里 ...

  8. 使用新版本EasyExcel优雅的导入和导出Excel文件

    一.需求描述 最近系统后台有个关于使用Excel文件导出数据的需求,首先想到了POI和阿里的EasyExcel.经过技术选型和结合具体场景,最终决定使用EasyExcel. 使用过程中,遇到了一些问题 ...

  9. 基于SpringBoot的多线程实现快速导入EXCEL

    前言:笔者已经做过多个版本的EXCEL导入功能.此次出一版基于SpringBoot的多线程实现快速导入EXCEL,效率之高体现在速度之快,单次解析的数据量之大.对比如下: 第一版:导入5万条数据,花费 ...

最新文章

  1. 6G目前进展与未来展望
  2. 使用await实现多接口并行调用
  3. php 什么时候销毁对象,什么决定什么时候在PHP中销毁类对象?
  4. javascript --- 几个其他的跨域技术(图像Ping、JSONP、Comet)
  5. P4707-重返现世【dp,数学期望,扩展min-max容斥】
  6. 第三次作业:PSP耗时
  7. 软能力那点事,你知多少
  8. linux编译c文件for循环,Linux C 循环队列的实现
  9. jenkins 下载插件 一直失败_实用测试技能分享:jmeter+Jenkins性能测试自动化搭建...
  10. vivo android 6.0 root,vivo X6 A(全网通)如何获取ROOT权限教程
  11. 非线性系统基于干扰观测器的抗干扰控制
  12. Centos7之卸载oracle11G
  13. 修改redis配置文件,并以指定配置文件的方式启动
  14. AISG2.0(二)——什么是电调天线,及AISG在其中的应用
  15. 什么是 Access Token
  16. linux mysql.sock文件_关于linux上mysql.sock文件的个人理解
  17. ae合成设置快捷键_AE中常用的快捷键,你了解多少?(五)
  18. 10大顶级运营商转型案例剖析
  19. 网页第三方追踪原理——如何通过1像素的图片追踪
  20. 完美破解下载神器IDM

热门文章

  1. 【SPI】SPI学习之SPI硬件相关
  2. 剑三服务器在哪个文件夹,剑网3无法正常获取服务器列表解决方法
  3. cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...
  4. 深度学习与自然语言处理实验——中文信息熵的计算
  5. 假如易立竞吐槽程序员。。。
  6. 梦龙物联卡冻结_四川梦龙科技物联卡哪个划算
  7. 全球与中国直流小型功率继电器市场现状及未来发展趋势
  8. 51信用卡管家app产品需求文档
  9. c语言中对用户乱输入信息处理,C语言程序设计教程 第06章.ppt
  10. linux php preg扩展,PHP_linux shell 正则表达式(BREs,EREs,PREs)差异比较,在计算机科学中,是指一个用 - phpStudy...