easyExcel导入表格

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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/7589.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【根据模板导出多sheet表格数据】

文章目录 1. 根据模板导出多sheet表格数据1. 先上代码2. 模板展示3. 数据构造1.实体类创建2. sql数据构造(主要是需要把结果集别名映射到对应的实体类上) 2. 无模板多sheet导出1. code部分 3. 效果演示image-20220930172145001结言 本文章主要是记录自己的一些心得和之前写过的…

如何将excel表格数据导入postgresql数据库

作者&#xff1a;瀚高PG实验室 &#xff08;Highgo PG Lab&#xff09;- 禹晓 实际的工作中&#xff0c;我们经常会碰到统计数据的工作&#xff0c;有些维度的统计数据因为工作需要我们需要导出为excel作为报表附件供不同的部门审查。为了方便以后的对比工作&#xff0c;领导会…

table表格直接导出Excel文件

注&#xff1a;如遇到复杂表格时可用此方法做前端导出 导出事件 handleDown() {var html "<html><head><meta charsetutf-8 /></head><body>" document.getElementsByTagName("table")[0].outerHTML "</body&g…

将ChatGPT整合到Word中

引言 自ChatGPT出现&#xff0c;各种基于它的软件扩展纷至沓来&#xff0c;目前Word支持ChatGPT的add-in有两款&#xff0c;可以通过: 插入->获取加载项->搜索openai查看。 其中Ghostwriter从介绍上看功能比较单一&#xff0c;而且软件需要购买&#xff0c;用自己的API-k…

用上ChatGPT的这几个功能,你的开发效率不高都难

ChatGPT去年12月份开始火得不行了&#xff0c;它彻底改变了程序员开发代码的方式。怎么来提高程序员开发程序的效率呢&#xff1f;可能现在大多数软件开发人员仍然没有习惯使用 ChatGPT&#xff0c;本文将介绍几种方式来提升和简化自己的工作。 一、重构你的代码 如果你是一个开…

Intellij:自然语言到代码自动生成 by ChatGPT

背景 Intellij是一个非常流行的开发工具&#xff0c;它被广泛用于软件开发。随着OpenAI训练的ChatGPT模型越来越智能&#xff0c;我们开发了一个名为EDQL的Intellij插件。这个插件可以将ChatGPT的智能写代码能力转化为代码。 安装和尝试: https://github.com/chengpohi/edql/re…

chatgpt到底颠覆了什么 第二部分

以第二个理由就是两个字&#xff0c;垄断。 现在谈到范式转变&#xff0c;如果首先谈的还是算法&#xff0c;那说明还没有透彻理解范式改变范式改变&#xff0c;首先要改的是什么。是什么&#xff1f;是参赛资格。 过去我相信大企业大团队聚拢了许多聪明的脑袋&#xff0c;但我…

chatgpt 到底颠覆了什么 第一部分

ChatGPT一出来&#xff0c;一堆搞NLP的立马哭了。为什么&#xff1f;不该问为什么哭&#xff0c;而该问为什么还不哭。 有两个立马大哭的理由。 第一个理由很多人说了&#xff0c;范式改变。 虽然说没有哪个研究领域&#xff0c;甚至没有哪个领域敢说自己真的是天道酬勤绝对公平…

文心一言---中国版的“ChatGPT”狂飙的机会或许要出现了

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

果然,ChatGPT 技术还是被拿去搞黄色了!

转自&#xff1a;顶级程序员 此前&#xff0c;推出的各类AI绘画工具。 想要制作出还能看得过去的作品&#xff0c;需要一定的美术功底和美感&#xff0c;上手门槛一点也不低。 大部分绅士顶多做个饱饱眼福的观众&#xff0c;完全没有参与感。 啪得一下很快啊&#xff0c;最近一…

ChatGPT 漩涡 :The ChatGPT Maelstrom

ChatGPT 漩涡 by Jean-Louis Gasse ChatGPT 以自 2007 年 iPhone 问世以来从未见过的方式迅速俘获了人们的想象力。今天,我们试探性地随机漫步其迅速扩张的景观。 在结束了法国和奥地利部分地区的旅行后,当我愉快地回到我的写作站时,我在我钟爱的科技世界中看到了太多诱人…

ChatGPT神奇应用:快速撰写大众点评好评

正文共 464 字&#xff0c;阅读大约需要 2 分钟 消费者必备技巧&#xff0c;您将在2分钟后获得以下超能力&#xff1a; 快速自动撰写大众点评评论 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●…

被ChatGPT带飞的AIGC,能为垂直产业做些什么?

2022年8月&#xff0c;游戏设计师杰森艾伦使用 Midjourney 平台创作了一幅名为《太空歌剧院》的画作&#xff0c;并获得了美国科罗拉多州博览会艺术类比赛一等奖&#xff0c;引起巨大轰动和舆论&#xff0c;彻底引爆 AIGC 的热潮。 ● 图片来源&#xff1a; AI 作画《太空歌剧院…

【chatGPT】

chatGPT&#xff08;Generative pretrained transformer &#xff09; ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过理解和学习人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人类一样来聊天交流&#xff0c;甚至能完…

「ChatGPT」一夜之间“火爆出圈“【杞人忧天 or 未雨绸缪】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

InstructGPT原理讲解及ChatGPT类开源项目

InstructGPT原理讲解及ChatGPT类开源项目 Generative Pre-Trained Transformer&#xff08;GPT&#xff09; 是OpenAI的提出的生成式预训练语言模型&#xff0c;目前已经发布了GPT-1、GPT-2、GPT-3和GPT-4&#xff0c;未来也将发布GPT-5。 最近非常火的ChatGPT是基于Instruct…

数据开源 | Magic Data开源基于ChatGPT的可扩展的对话数据集

在过去的一月里&#xff0c;人工智能领域中最火的话题莫过"ChatGPT"。ChatGPT是OpenAI于11月30日发布最新作品聊天机器人&#xff0c;开放公众免费测试。聊天机器人是一种软件应用程序&#xff0c;根据用户的提问做出回应、模仿人类的对话方式。目前&#xff0c;Chat…

chatgpt赋能python:Python的玩法

Python的玩法 Python作为一种高级编程语言&#xff0c;在计算机编程领域非常流行。它是一种自由软件&#xff0c;可以在多种平台上运行。Python在数据科学、机器学习等土地居功无比&#xff0c;但它的应用除了这些重磅级领域&#xff0c;还有很多有趣的玩法。 编写游戏 Pyth…

教你轻松玩转-ChatGPT或生成类大模型--助你成为未来高端黄金职业人

文章目录 1、前言2、大模型--巴拉巴拉小魔仙3、巴拉巴拉小魔仙-指导方向3、二次元美女或科幻图-魔法4、Cosplay-魔法5、魔法师5.1、系统消息5.2、小样本学习5.3、非对话场景5.4、使用明确的指令5.5、最后重复一遍指令5.5、对输出的操作5.6、添加语法5.7、把任务分解5.8、思维链…

海外ChatGPT专题

作为AIGC领域顶尖的模型&#xff0c;ChatGPT有望对现有生产力工具进行变革&#xff0c;引领赛道发展。海外ChatGPT专题_up.pdf: https://url39.ctfile.com/f/2501739-805099789-098b62?p2096 (访问密码: 2096) 参考文献&#xff1a; [1]海外ChatGPT专题_up.pdf: https://url39…