使用EasyExcel做excel文件解析
如题所示
项目中需要做表格导入功能,决定采用EasyExcel来进行操作,文件解析相对简单,不像导出那么复杂
demo使用到的依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope>
</dependency>
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope>
</dependency>
<dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>RELEASE</version><scope>compile</scope>
</dependency>
具体代码展示如下:
package com.excel.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import com.biz.primus.common.exception.BizSilentException;
import lombok.extern.slf4j.Slf4j;import java.util.*;/*** @author: 骑猪撞地球QAQ* @date: 2022/3/28 15:34* @content: 动态表头数据解析监听器*/
@Slf4j
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {List<Map<String, Object>> addList = new ArrayList<>();/*** 存储Key*/Map<Integer, String> key = new HashMap<>();/*** keuList*/List<String> keyList = new ArrayList<>();/*** 重写invokeHeadMap方法,获去表头,如果有需要获取第一行表头就重写这个方法,不需要则不需要重写** @param headMap Excel每行解析的数据为Map<Integer, String>类型,Integer是Excel的列索引,String为Excel的单元格值* @param context context能获取一些东西,比如context.readRowHolder().getRowIndex()为Excel的行索引,表头的行索引为0,0之后的都解析成数据*/@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {log.info("解析到一条头数据:{}, currentRowHolder: {}", headMap.toString(), context.readRowHolder().getRowIndex());Set<Integer> integerSet = headMap.keySet();for (Integer integer : integerSet) {keyList.add(headMap.get(integer));}key.putAll(headMap);}/*** 读取数据 筛选过滤数据 赛选出那些数据是添加 那些数据是修改** @param data 传入数据* @param context 读取数据*/@Overridepublic void invoke(Map<Integer, String> data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));HashMap<String, Object> objectObjectHashMap = new HashMap<>();Set<Integer> integerSet = data.keySet();String name = "";for (Integer integer : integerSet) {String s = data.get(integer);if (integer == 0) {name = data.get(integer);} else {// 第一格为战区、部门名称数据,不做校验boolean number = this.isNumber(data.get(integer));if (!number) {throw new BizSilentException(name + "数据格式错误,请调整后重试!");}}objectObjectHashMap.put(key.get(integer), s);}addList.add(objectObjectHashMap);}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}/*** 是否是数字或小数位不超过两位** @param str 需要校验字符串* @return true:是;false:不是*/private boolean isNumber(String str) {String reg = "\\d+(\\.\\d+)?";if (str.matches(reg)) {String ss[];if (str.contains(".")) {ss = str.split("\\.");String s = ss[1];return s.length() <= 2;}}return str.matches(reg);}
}
/*** 此处我们是由前端上传到文件服务器,再把url回传后端进行处理,也可直接传文件,后端使用MultipartFile的接收,InputStream inputStream = multipartFile.getInputStream()获取流*/public List<Map<Integer, String>> importData(String url){//初始化监听器NoModelDataListener noModelDataListener = new NoModelDataListener();// InputStream InputStream inputStream;try {URL url = new URL(url1);URLConnection connection = url.openConnection();inputStream = connection.getInputStream();} catch (IOException e) {e.printStackTrace();throw new RuntimeException("读取文件失败!");}//解析数据 前三行为表头,从第四行开始读取 excelType()为指定文件类型,不需要也可以,sheet()为指定sheet,0为第一个sheet,headRowNumber()为开始读取的行数return EasyExcelFactory.read(inputStream, noModelDataListener).excelType(ExcelTypeEnum.XLSX).sheet(0).headRowNumber(3).doReadSync();}
使用EasyExcel做excel文件解析相关推荐
- Excel文件解析性能对比(POI,easyexcel,xlsx-streamer)
问题: 在解析excel内容时,由于用户误操作,偶尔会误录入大量空行,如果代码处置不当,进行文档内容解析时,就会占用大量时间和内存,甚至引起服务器内存消耗殆尽,导致服务无法访问,或者引起OOM. 解决 ...
- EasyExcel实现Excel文件导入导出
1 EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持读写百M的Excel. github地址: https://git ...
- java中 Excel文件解析及超大Excel文件读写
本文主要对Excel中数据的解析和生成进行总结 前言 在应用程序的开发过程中,我们经常要用到Excel进行数据的导入或导出.所以,在通过Java语言实现此类需求时,通常会对Excel文件进行解析或生成 ...
- easyexcel导入时读不到数据_SpringBoot中EasyExcel实现Excel文件的导入导出
前言 在我们日常的开发过程中经常会使用Excel文件的形式来批量地上传下载系统数据,我们最常用的工具是Apache poi,但是如果数据到底上百万时,将会造成内存溢出的问题,那么我们怎么去实现百万数据 ...
- Alibaba开源工具EasyExcel读写Excel文件
前言 工作中使用 excel 表格处理数据是很常见的操作,经常会使用 excel 文件来导入数据或者导出数据,是不是脑海中已经思考有哪些处理excel框架? 小编之前呢就知道Java 解析.生成 Ex ...
- 阿里EasyExcel读写excel文件的基本使用
EasyExcel读写excel文件 1.EasyExcel简介 2.对excel的写操作 1.1 创建一个普通的maven项目并引入相关依赖 1.2 创建实体类 1.3 实现写操作 1.3.1 创建 ...
- 浅谈Excel文件解析
日常生活中,我们经常会遇到一些Excel文件,一般我们只会去用,不会去想他到底是怎样进行数据导入和导出的,今天,我们看看在java应用开发过程中,Excel文件的解析过程. 1. 使用-XSSF解析E ...
- jxls使用excel公司_使用jXLS将Excel文件解析为JavaBeans
jxls使用excel公司 这篇文章展示了如何使用jXLS将Excel文件解析为JavaBeans列表. 这是我编写的通用实用程序方法: /** * Parses an excel file into ...
- 使用jXLS将Excel文件解析为JavaBeans
这篇文章展示了如何使用jXLS将Excel文件解析为JavaBeans列表. 这是我编写的通用实用程序方法: /** * Parses an excel file into a list of bea ...
最新文章
- 在CentOS 6.6 64bit上安装截图软件shutter
- FSMO角色的Windows界面查看和转移示例
- solr的安装配置与helloworld
- 一个简单的Dockerfile
- JAVA中protected的作用
- 当面试官问你了不了解defineProperty的时候。。。
- 购买的Microsoft Office不小心卸载后重新安装方法
- 某电商客户数据价值分析项目
- AOP思想实现集中式登录,用户行为统计框架
- 从零搭建WebApi接口开发框架-接口规范
- google浏览器(chrome)登录、同步
- android 照片点击查看,Android PhotoView点击放大图片效果
- 多发性硬化功能磁共振成像
- 神舟Z7本安装Linux系统,神舟战神Z7-KP7GAISO重装原版Win10系统的方法
- python 根据网易云歌曲的ID 直接下载歌曲
- 总结下花了大约半年的时间从零开始的unity游戏开发(1)
- Learning Python 学习Python Lynda课程中文字幕
- Encoding常用方法,不积硅步无以至千里
- PAT乙级------1006~1010附代码及思路
- 手把手教你用artifactory搭建maven私有仓库