easyExcel导入表格

本文章是介绍java,通过easyExcel导入较为复杂的表格

导入表格如下

前提工作导包

<!--     hutool--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.0</version></dependency><!--     Easy Excel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>

数据封装工具类,继承实现AnalysisEventListener

public class EasyExcelListener extends AnalysisEventListener<Object> {// 创建list集合封装最终的数据private List<Object> list = new ArrayList<>();// sheet页索引private int sheetNo = 0;@Overridepublic void invoke(Object t, AnalysisContext context) {// 读取excle内容int currentSheetNo = context.readSheetHolder().getSheetNo();if (currentSheetNo != sheetNo) {// 如果不根据sheet页索引更新状态重新创建list,list会反复添加前面的sheet页对象值list = new ArrayList<>();sheetNo = currentSheetNo;}list.add(t);}// 读取excel表头信息@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {}// 读取完成后执行@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}/*** 获取表格内容(简单excel读取可用该方法)** @param obj 需要转化的实体* @param <T>* @return*/public <T> List<T> getList(Class<T> obj) {String jsonObj = JSONUtil.toJsonStr(list);return JSONUtil.toList(jsonObj, obj);}/*** 将表格转化为map集合(复杂excel读取用此方法)** @return map集合*/public List<LinkedHashMap> getListMap() {String jsonObj = JSONUtil.toJsonStr(list);return JSONUtil.toList(jsonObj, LinkedHashMap.class);}}

EasyExcelUtil :表格读取工具类

public class EasyExcelUtil {private EasyExcelUtil() {}/*** 根据easyexcel注解给指定实体赋值** @param objects 读取的表格内容* @param clazz   需转化的实体* @param <T>     实体* @return 需转化的提示集合*/public static <T> List<T> convertList(List<LinkedHashMap> objects, Class<T> clazz) {List<T> results = new ArrayList<>(objects.size());try {Map<String, Field> objIndex = new HashMap<>();// 获取转化实体字段信息集合Field[] fields = clazz.getDeclaredFields();for (Field field : fields) {// 根据实体上Easy Excel的ExcelProperty注解中的索引值对应excel读取数据的值int index = field.getAnnotation(ExcelProperty.class).index();// 设置字段可编辑field.setAccessible(true);objIndex.put(String.valueOf(index), field);}T obj = null;for (LinkedHashMap o : objects) {obj = clazz.newInstance();for (Object key : o.keySet()) {// 如果表格索引与字段注解指定索引一样则赋值if (objIndex.containsKey(key)) {Object object = o.get(key);Object value = null;Field field = objIndex.get(key);if (ObjectUtil.isEmpty(object)) {continue;}Class<?> type = field.getType();String replace = object.toString();// 有特殊需要处理的字段类型则在此进行处理if (type == BigDecimal.class) {value = "--".equals(replace) ? null : new BigDecimal(replace.replace(",", ""));} else if (type == Integer.class) {// String强转Integer会报错,所以需要单独进行转化value = "--".equals(replace) ? null : Integer.valueOf(replace.replace(",", ""));} else {value = object;}field.set(obj, value);}}results.add(obj);}} catch (Exception e) {e.printStackTrace();
//            log.error("字段解析失败", e);
//            Asserts.fail("字段解析失败:" + e.getMessage());}return results;}}

Controller层代码

  public void upload(@ApiParam(name = "file", value = "file", required = true) @RequestParam(value = "file") MultipartFile file) throws Exception {// 1. 读取excel内容EasyExcelListener easyExcelListener = new EasyExcelListener();InputStream inputStream = file.getInputStream();ExcelReaderBuilder read = EasyExcelFactory.read(file.getInputStream(), easyExcelListener);ExcelReader excelReader = read.build();// 2.获取各个sheet页信息List<ReadSheet> sheets = excelReader.excelExecutor().sheetList();// 3. 将各个Shhet页表格内容存于mapMap<Integer, List<LinkedHashMap>> sheetInfos = new HashMap<>(sheets.size());for (ReadSheet sheet : sheets) {Integer sheetNo = sheet.getSheetNo();excelReader.read(sheet);sheetInfos.put(sheetNo, easyExcelListener.getListMap());}//拿到附件地址,将文件存储业务使用String upload = FileUploadUtils.upload(file);// 调用setCompetitiongroupReport()将文档内容进行读取,// get(0)是默认读取第一个sheet页setCompetitiongroupReport(sheetInfos.get(0));}

setCompetitiongroupReport():将表格数据封装到对象里

    private void setCompetitiongroupReport(List<LinkedHashMap> maps) {//1.参赛单位信息,实体类直接set处理,SysCompetitiongroup sysCompetitiongroup=new SysCompetitiongroup();// 2.教练员信息数组List<LinkedHashMap> optionCoachDetails = new ArrayList<>();// 3.教练员信息类,需要进行注解处理SysCompetitiongroupCoachs sysCompetitiongroupCoachs =new SysCompetitiongroupCoachs();// 4.参赛运动员信息,需要进行注解处理SysCompetitiongroupStudents sysCompetitiongroupStudents=new SysCompetitiongroupStudents();// 5.参赛运动员信息数组List<LinkedHashMap> optionStudentsDetails = new ArrayList<>();// 参赛单位信息boolean groupinfo = true;// 教练员信息boolean Coachinfo = false;boolean Studentsinfo = false;for (LinkedHashMap map : maps) {// 1.判断信息是否是属于参赛单位信息,默认为true;if (groupinfo) {boolean dealBaseInfo = dealBaseInfo(map, sysCompetitiongroup);// 参赛单位信息读取完成 设置为false,再次遍历将不读取if(!dealBaseInfo){groupinfo=false;}}// 教练员信息if (map.containsValue("教练员信息")) {Coachinfo=true;}if (Coachinfo){Boolean aBooleanCoach = dealCoachDetails(map, optionCoachDetails);if (!aBooleanCoach){Coachinfo=false;}}// 参赛运动员信息if (map.containsValue("参赛运动员信息")) {Studentsinfo=true;}if(Studentsinfo){dealStudentDetails(map, optionStudentsDetails);}}//将List里面的数据转换到实体类当中List<SysCompetitiongroupCoachs> Coach = EasyExcelUtil.convertList(optionCoachDetails, SysCompetitiongroupCoachs.class);//将List里面的数据转换到实体类当中List<SysCompetitiongroupStudents> student = EasyExcelUtil.convertList(optionStudentsDetails, SysCompetitiongroupStudents.class);}

@ExcelProperty(value = “姓名”, index = 1),value代表名称,index表格对应下标位置

@ApiModel("教练员信息")
public class SysCompetitiongroupCoachs {@ApiModelProperty(value = "序号")@ExcelProperty(value = "序号", index = 0)private String num;/** 教练员姓名 */@ApiModelProperty(value = "姓名")@ExcelProperty(value = "姓名", index = 1)private String username;/** 教练员性别 */@ApiModelProperty(value = "性别")@ExcelProperty(value = "性别", index = 2)private String sex;/** 身份证号 */@ApiModelProperty(value = "身份证号")@ExcelProperty(value = "身份证号", index = 3)private String number;/** 手机号 */@ApiModelProperty(value = "电话(手机)")@ExcelProperty(value = "电话(手机)", index = 4)private String phone;
}

dealBaseInfo() 参赛单位信息模块处理,直接比对set就好了

 /***  参赛单位信息筛选*/private boolean dealBaseInfo(LinkedHashMap map, SysCompetitiongroup baseInfo) {// 是否基础信息内容if (map.containsValue("教练员信息")) {return false;}Object obj = map.get("3");String str = null;if (ObjectUtil.isNotEmpty(obj)) {str = obj.toString();}if (ObjectUtil.isNotEmpty(obj)) {str = obj.toString();}if (map.containsValue("中体协滑雪会员学校代码:")) {baseInfo.setSchoolCode(str);}if (map.containsValue("报名单位全称:")) {baseInfo.setGroupName(str);}if (map.containsValue("报名单位所属省、市:")) {baseInfo.setGroupCity(str);}if (map.containsValue("报名经办人姓名:")) {Object obj2 = map.get("2");String str2 = null;if (ObjectUtil.isNotEmpty(obj2)) {str2 = obj2.toString();}Object obj4 = map.get("4");String str4 = null;if (ObjectUtil.isNotEmpty(obj4)) {str4 = obj4.toString();}baseInfo.setGroupUsername(str2);baseInfo.setGroupPhone(str4);}if (map.containsValue("姓名:")) {Object obj2 = map.get("2");String str2 = null;if (ObjectUtil.isNotEmpty(obj2)) {str2 = obj2.toString();}Object obj4 = map.get("4");String str4 = null;if (ObjectUtil.isNotEmpty(obj4)) {str4 = obj4.toString();}baseInfo.setCoachname(str2);baseInfo.setCoachphone(str4);}return true;}

dealCoachDetails()处理教练员信息,根据表格情况进行处理

 /*** 处理教练员信息**/private Boolean dealCoachDetails(LinkedHashMap map, List<LinkedHashMap> optionAccountsDetails) {// 如果读取数据,已经不是当前表格,直接false,不在进行读取if (map.containsValue("参赛运动员信息")) {return false;}// 将序号和教练员信息进行过滤if(map.size()>0) {if (!map.containsValue("序号") && !map.containsValue("教练员信息")) {optionAccountsDetails.add(map);}}return true;}

dealStudentDetails():处理参赛运动员信息模块,根据表格情况进行处理

  /*** 处理参赛运动员信息*/private Boolean dealStudentDetails(LinkedHashMap map, List<LinkedHashMap> optionAccountsDetails) {if (map.size()>0) {if (!map.containsValue("序号") && !map.containsValue("参赛运动员信息") && !map.containsValue("团体赛")) {optionAccountsDetails.add(map);}}return true;}

easyExcel导入表格相关推荐

  1. 使用EasyExcel导入表格实现xlsx文件批量插入-----linux的mysql

    介绍 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI ...

  2. EasyExcel导入导出下载模板(带下拉)

    EasyExcel导入导出网上资料很多,这里就不多做描述了,总之就是一款比较轻而小,易用的excel操作工具包:这里在项目中使用到,做下笔记.以及表格中下拉框的实现: 声明:本文思路是借鉴于某大神的, ...

  3. 【使用EasyExcel导入导出】

    使用EasyExcel导入导出 一,为什么要使用EasyExcel 1.1 EasyExcel与Poi的区别 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个 ...

  4. EasyExcel导入在索引、类型都正确的情况下导入失败

    EasyExcel导入在索引.类型都正确的情况下导入失败 EasyExcel 错误详情 找到问题 解决问题 总结 EasyExcel 使用 EasyExcel 导入时出现了一些错误,在此记录一下,方便 ...

  5. Spring Boot + EasyExcel 导入导出,好用到爆,可以扔掉 POI 了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.EasyExcel EasyExcel是阿里巴巴开源poi插件之一,主要解决了poi框架使用复杂,sax解析模式不容易操作,数据 ...

  6. Spring Boot + EasyExcel 导入导出,好用到爆!

    今日推荐 Java 8 一行代码解决了空指针问题,太厉害了...List中remove()方法的陷阱,被坑惨了!25000 字详解 23 种设计模式,原来可以这么简单!最牛逼的 Java 日志框架,性 ...

  7. EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File

    今天用EasyExcel导入的时候报错,如下 com.alibaba.excel.exception.ExcelAnalysisException: java.lang.NoClassDefFound ...

  8. table表格边框样式_如何在CAD创建、导入表格?原来CAD的表格功能这么强大

    阅读本文前,请您先点击上面的"蓝色字体",再点击"关注",这样您就可以继续免费收到文章了.如果喜欢就关注订阅吧!也不要忘记点赞哦~亲,看的开心可以点个好看 . ...

  9. easyexcel导入获取表头并且表头为不固定列

    转自:http://t.zoukankan.com/pzw23-p-13354908.html easyexcel导入获取表头并且表头为不固定列 Controller @PostMapping(&qu ...

最新文章

  1. C/C++编写的反向SHELL
  2. Mac下安装的MySQL root账号无法登陆用户解决
  3. linux服务器 32核,Intel换成AMD 32核锐龙 Linux之父体验很好
  4. 关于 NIO 你不得不知道的一些“地雷”
  5. 解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题...
  6. 俄罗斯四人***团伙黑掉整个城市ATM机
  7. C++ 为什么要用覆盖(学习笔记)
  8. HP DL G8系列服务器安装Server2003系统显卡驱动的问题
  9. python 列表推导式csv_Python 列表推导式
  10. .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
  11. LINUX开源监控平台Nagios(主机监控配置)
  12. 启用IIS6的GZIP功能,提高网站打开速度,减少带宽占用【转】
  13. Atitit 获取剪贴板内容 目录 1.1. ava提供两种类型的剪贴板:系统的和本地的. 1 1.2. Atitit 剪贴板数据类型 DataFlavor 1 1.3. Atitit 获取剪贴板内
  14. 最新SSCI影响因子以及分区名单
  15. RGB图片和mask合在一起
  16. Java根据isbn查询图书信息_isbn书号查询api,根据图书ISBN查询详细信息
  17. 如何查看系统开关机时间
  18. phhphphphphphphp转自 细雪之舞 专注DEV
  19. WIN10 系统重新安装 WIN7 系统步骤
  20. 使用python快速开发桌面小工具

热门文章

  1. 电线平方表示什么意思 电线有多少平方的
  2. 无线网络的前景在哪里?
  3. 梦幻西游html简易代码
  4. 虚拟机VirtualBox下载与安装+虚拟机配置
  5. dotnet core使用mvc创建web服务器
  6. 2.4G wifi 的频道/信道 20M 40M的概念,区别
  7. pythonxpath定位_一文搞懂 XPath 定位
  8. linux shell 中判断文件、目录是否存在
  9. 至 我的大学 (国庆假期随笔作业)
  10. SpringBoot系列3-----Docker SpringBoot与数据访问 启动原理 自定义starters