导包:

            <easyexcel.version>3.0.5</easyexcel.version><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>${easyexcel.version}</version></dependency>

 自定义监听器:

public class EasyExcelListener<T> extends AnalysisEventListener<T> {private static final Logger log = LoggerFactory.getLogger(EasyExcelListener.class);/*** 批量限制*/private static final int BATCH_SIZE = 1000;/*** 接受一个参数,然后调用指定方法验证所有字段是否满足要求,不满足返回错误信息* 也可以定义Consumer<T> 该函数返回Boolean*/private final Function<T, String> verify;/*** 接受一个list集合,然后执行数据保存入库等相关操作*/private final Consumer<List<T>> consumer;/*** 解析出来的数据零时存储的地方*/private final List<T> storage;/*** 统计解析条数*/private int size = 0;/*** 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据*/@Overridepublic void invoke(T data, AnalysisContext context) {log.info("解析到一条数据:{}", JSONUtil.toJsonStr(data));//符合校验规则则添加String message = verify.apply(data);if (StrUtil.isNotBlank(message)) {log.error("第{}行解析异常:{}", context.readRowHolder().getRowIndex() + 1, message);/*这里可以增加一些报错错误信息的操作*/return;}storage.add(data);// 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOMif (storage.size() >= BATCH_SIZE) {accept();}}/*** 所以的数据解析完了调用*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {// 確保所有数据都完成入库accept();log.info("所有数据解析完成!");}/*** 监听器实现这个方法就可以在读取数据的时候获取到异常信息*/@Overridepublic void onException(Exception exception, AnalysisContext context) {if (exception instanceof ExcelDataConvertException) {ExcelDataConvertException ex = (ExcelDataConvertException) exception;log.error("第{}行,第{}列解析异常", ex.getRowIndex() + 1, ex.getColumnIndex() + 1);/*这里可以增加一些报错错误信息的操作*/}}/*** 入库、计数、清空等操作*/private void accept() {consumer.accept(storage);size += storage.size();storage.clear();}public EasyExcelListener(Function<T, String> verify,Consumer<List<T>> consumer,List<T> storage) {this.verify = verify;this.consumer = consumer;this.storage = storage;}}

 使用:

        verify 自定义数据校验的方法

        saveOrUpdate 数据保存或修改的相关操作

     EasyExcelListener<Test> easyExcelListener = new EasyExcelListener<>(this::verify,this::saveOrUpdateBatch,new ArrayList<>());EasyExcel.read(File.getInputStream(), Test.Class, excelListener).sheet().doRead();

Test类

public class Test {@ExcelProperty(value = "序号")private Integer number;@ExcelProperty(value = "编码")private String code;@ExcelProperty(value = "经度", converter = CustomDoubleConverter.class)private Double longitude;@ExcelProperty(value = "纬度", converter = CustomDoubleConverter.class)private Double latitude;//省略get set
}
CustomDoubleConverter类
public class CustomDoubleConverter implements Converter<Double> {@Overridepublic Class<Double> supportJavaTypeKey() {return Double.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.NUMBER;}/*** 读的时候会调用** @param context* @return* @throws Exception*/@Overridepublic Double convertToJavaData(ReadConverterContext<?> context) throws Exception {BigDecimal numberValue = context.getReadCellData().getNumberValue();if(numberValue == null){String stringValue = context.getReadCellData().getStringValue();if(StrUtil.isBlank(stringValue)){return null;}Matcher matcher = SmartConstants.DOUBLE_PATTERN.matcher(stringValue);if(matcher.find()){return Double.valueOf(stringValue);}return null;}return numberValue.doubleValue();}/*** 写的时候会调用** @param context* @return* @throws Exception*/@Overridepublic WriteCellData<?> convertToExcelData(WriteConverterContext<Double> context) throws Exception {Double value = context.getValue();return new WriteCellData<>(String.valueOf(value));}
}

EasyExcel导入(仅供参考)相关推荐

  1. 如何有效防止DEDE织梦系统被挂木马安全设置(仅供参考)

    尊敬的客户,您好! 感谢广大客户对我司工作的信任和支持! 我司在最近的一个多月内陆续发现多起因 DedeCMS 安全漏洞造成网站被上传恶意脚本的事件,入侵者可利用恶意脚本对外发送大量数据包,严重占用C ...

  2. 操作系统P,V(wait,signal原语)操作讲解,以及两个例题(答案仅供参考)

    操作系统的pv操作是很核心的概念. 临界区 : 我们把并发进程中与共享变量有关的程序段称为临界区. 信号量 : 信号量的值与相应资源的使用情况有关.当它的值大于0时,表示当前可用资源的数量:当它的值小 ...

  3. 【java】 ssm+ssh原生态框架(仅供参考)

    以前刚学框架的时候自己搭建的两个框架,一个是Struts2+Spring+Hibernate-(SSH),还有一个就是Spirng+SpringMVC+Mybatise-(SSM), 其中SSH项目中 ...

  4. 短信接口与短信平台收费标准----速码云仅供参考

    文章来源:http://www.4006026717.com 就目前来说短信接口 价格参考 行业收费也基本上没有个固定的标准的价格,都是看各个公司自己的通道套餐跑的量和公司的运营成本结合预算后最终才来 ...

  5. 链表知识体会总结(仅供参考)

    仅供参考: 链表分单向,双向,循环三种. 链表的基本操作包括:顺序建表,逆建,结点插入,删除,链表的合并,拆分等. 顺建:需要定义三个结构体指针***head, t, p.申请头结点head----h ...

  6. vue的axios两种写法(不知道对不对,仅供参考)

    vue的axios两种写法(不知道对不对,仅供参考) `methods () {     getHomeInfo () {         axios.get ('/api/index.json') ...

  7. 数字IC笔试题,大疆校招16题(仅供参考)

    \\\插播一条: 自己在今年整理一套单片机单片机相关论文800余篇 论文制作思维导图 原理图+源代码+开题报告+正文+外文资料 想要的同学私信找我. 数字IC笔试题,大疆校招16题(仅供参考) 1.异 ...

  8. 高考志愿填报APP靠谱吗?大数据仅供参考不能依赖

    6月24日,在众多考生的等待中,陕西2019年高考分数线公布.分数线公布后,对于考生和家长来说,最重要的事情就是填报高考志愿了.针对这种需求,一些指导高考志愿填报的APP应运而生.今天南京软件开发公司 ...

  9. 学堂在线《工程伦理》第八章课后习题及答案(仅供参考)

    学堂在线<工程伦理>第九章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十章课后习题及答案(仅供参考) 学堂在线<工程伦理>第十一章课后习题及答案(仅供参考) ...

最新文章

  1. 学建筑要学哪些计算机绘图,建筑学专业学CAD买什么书好?
  2. Xshell dns tunnel攻击
  3. 线程池ExcutorThreadPool的运行原理
  4. 应用语言学 计算机语言学,应用语言学的名词解释
  5. DELPHI实现游戏内存的修改
  6. Java消息队列--ActiveMq 初体验
  7. 循环自相关函数和谱相关密度(二)——实信号、复信号模型下的BPSK信号循环谱推导
  8. Nginx报错:nginx: [emerg] CreateFile() nginx.conf“ failed (3: The system cannot find the path specified
  9. 信息学奥赛一本通C++语言——1030: 计算球的体积
  10. Nginx原子操作及自旋锁实现
  11. oracle中代表任意一个字符的,oracle 语法
  12. Windows10中“SQL Server 配置管理器”哪去了?
  13. C++类中的static数据成员,static成员函数
  14. 彻底理解PHP的SESSION机制
  15. 以下mysql说法正确的是_下面关于 MySQL 的说法中,正确的是_商务统计学答案_学小易找答案...
  16. 高精度乘法———列表法
  17. Excel如何提取文本左边的数字
  18. 台式计算机和笔记本,大一买买笔记本还是台式电脑好?
  19. 人工智能导论:清览作业
  20. rdesktop用法

热门文章

  1. kindeditor php 跨域,kindeditor编辑器上传图片跨域
  2. 可解释性机器学习_Feature Importance、Permutation Importance、SHAP
  3. Jmeter单线程如何循环获取CSV参数
  4. python中执行shell脚本之subprocess模块
  5. js insertBefore
  6. 关于两IT男将电信天翼自带路由换成TPLink路由器的那些事
  7. 数据分析36计(九):倾向得分匹配法(PSM)量化评估效果分析
  8. 【手记】如果Idx/Sub字幕导不进MKVToolNix,看看是否这个原因
  9. 用 C++ 可以开发的 7 件事 | 解释 C++ 的特点和学习的优点
  10. oracle表领域的做成,Oracle的架构学会了就可以做一个框架软件设计师了