范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

记录一次使用Easyexcel上传导入数据库和导出EXCEL的实现过程

  这是一个最简单的例子,使用了Springboot/Thymeleaf/Mybatis等技术完成了初步的导入,给和我一样的初学者提供一点参考。
  一、数据表结构 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;  -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT "姓名",  `age` int(255) NULL DEFAULT NULL COMMENT "年龄",  PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 350 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;  SET FOREIGN_KEY_CHECKS = 1;
  二、实体类 package pers.gl.entity;  import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data;  @Data public class User { private String id; @ExcelProperty(value = "姓名", index = 0) private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; }
  三、mybatis的xml文件
  使用了批量插入数据的语句foreach。<?xml version="1.0" encoding="UTF-8"?>                   insert into user(name,age) values(#{name},#{age})                  insert into user(name,age) values                   (#{item.name},#{item.age})             
  四、mapper接口 package pers.gl.dao; import java.util.List; import pers.gl.entity.User; public interface UserMapper { // 全部数据 public List findAll(); // 插入数据 public int insertData(User user); // 批量增加保存 public int saveList(List list); }
  五、Service package pers.gl.service;  import java.util.List; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.alibaba.excel.EasyExcel; import pers.gl.dao.UserMapper; import pers.gl.entity.User;  @Service public class UserService { @Autowired private UserMapper userMapper; // 全部数据 public List findAll() { return userMapper.findAll(); } // 插入数据 public int insertData(User user) { return userMapper.insertData(user); } // 批量增加保存 public int saveList(List list) { return userMapper.saveList(list); }    //导出EXCEL文件 public void exportExcel(HttpServletResponse response) { // 需要导出的数据 List list = findAll(); // 设置响应类型 response.setContentType("application/vnd.ms-excel"); // 设置字符编码 response.setCharacterEncoding("utf-8"); // 设置文件名字 String fileName = "downFile_" + System.currentTimeMillis() + ".xlsx"; try { // 设置响应头信息 response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));  // 写入文件数据 EasyExcel.write(response.getOutputStream(), User.class).sheet("download").doWrite(list); } catch (Exception e) { throw new RuntimeException(e); } }  }
  六、ExcelListener监听 package pers.gl.service;  import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.fastjson.JSON; import pers.gl.entity.User;  public class ExcelListener extends AnalysisEventListener { private static final Logger logger = LoggerFactory.getLogger(User.class); /**  * 每隔5条存储数据库,实际使用中可以3000条,然后清理list,方便内存回收  */ private static final int BATCH_COUNT = 5; List list = new ArrayList<>();  private UserService userService;  // 构造函数,一定要写,添加到监听中 public ExcelListener(UserService userService) { this.userService = userService; }  @Override public void invoke(User data, AnalysisContext context) { // TODO Auto-generated method stub logger.info("invoke方法被调用"); logger.info("解析到一条数据:{}", JSON.toJSONString(data)); list.add(data); // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM if (list.size() >= BATCH_COUNT) { saveData(); // 存储完成清理 list list.clear(); } }  /**  * 所有数据解析完成了 都会来调用  *  * @param context  */ @Override public void doAfterAllAnalysed(AnalysisContext context) { // TODO Auto-generated method stub System.out.println("doAfterAllAnalysed方法 被调用"); // 这里也要保存数据,确保最后遗留的数据也存储到数据库 saveData(); logger.info("所有数据解析完成!"); }  /**  * 加上存储数据库  */ private void saveData() { logger.info("{}条数据,开始存储数据库!", list.size()); userService.saveList(list); logger.info("存储数据库成功!"); }     }
  七、Controller控制器 package pers.gl.controller;  import java.io.IOException; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; import com.alibaba.excel.EasyExcel; import pers.gl.entity.User; import pers.gl.service.ExcelListener; import pers.gl.service.UserService;  @Controller @RequestMapping("user") public class UserController { @Autowired private UserService userService;  @GetMapping("list") public String list(Model model) { List users = userService.findAll(); model.addAttribute("users", users); return "userlist"; }  @GetMapping("/download") public void excelExport02(HttpServletResponse response) { userService.exportExcel(response); }  @GetMapping("/import") public String toImportExcelPage() { return "importexcel"; }  @PostMapping("/uploadExcel") public String upload(MultipartFile file) throws IOException { EasyExcel.read(file.getInputStream(), User.class, new ExcelListener(userService)).sheet().doRead(); return "redirect:/user/list"; } }
  八、前台上传页面     导入EXCEL     

吸顶音箱特点及应用阜新声艺视听装会议吸顶音响需要考虑哪些方面?覆盖角度首先要考虑到会议吸顶音响的覆盖角度,吸顶音响的点位分布位置是否能够覆盖所需要覆盖的范围。算声压级衰减利用会议吸顶音响的持续最大声压级算声音,舞台灯光特色及常见配置阜新声艺视听剧场内舞台,有多种舞台,有普通镜框式舞台,有伸出式舞台,有岛式舞台,也有称为黑盒子的舞台,因为舞台形式不一,所以灯具的配置要求也不尽相同。在这里只谈一般普通的镜框式舞台,这种舞台不vivoX70Pro摄像功能,全新升级从智能手机诞生以来,配备的辅助功能越来越多,照相的清晰度和分辨率也越来越高,拍出的照片和录像也逐渐接近普通相机的水准,比如最近vivo最近产品X系列,vivox70更是采用专业摄像OPPO新款高性价比手机,大家都一起买买买吧对于手机,大家一直在追求高配置高性能,但有多少人在日常聊天上花费近万元,又有多少人能真正发挥出那款手机的真实性能呢?又有多少人能准确感觉到你的手机与其他手机之间的巨大差异?显然,很被比亚迪唐超级混动折服我是19年10月份买的唐DM,当时考虑了几个优点1比亚迪电池好2绿牌直上,绿牌已经属于是曲线救国了3唐外观很漂亮,我其实不太懂车,但是我觉得外观还是比较重要的,看起来要合眼缘,看起小米Note新机或将于10月下旬发布,顶配1亿像素,可还喜欢作为全球第二大手机厂商的小米,不论是在全球还是在国内的手机市场上,都是风头无两的红米是其旗下的子品牌,对小米这个手机品牌也起到了推动作用近日,通过红米品牌总经理卢伟冰卢伟在网上发表三星最新专利,新一代折叠式智能手机搭载双面屏指纹识别屏幕指纹识别技术已经是很多手机的必备技术,在这方面有什么创新呢?根据三星最新专利,他们必须在新一代折叠式智能手机上搭载双面屏指纹识别技术,三星的GalaxyZFold4有望首次发布保就业促民生,支持国产,万达集团怎么能这么优秀?突如其来的疫情,加剧了我国的就业压力,让我们懂得就业的不易。在各方面都深受影响的情况下,各个企业依然纷纷伸出援手,积极响应国家号召,在社会稳就业促就业方面多措并施,万达集团就是其中英集芯,推出了一款电源管理芯片IP2368以电动机或电磁铁为动力,通过传动机构驱动工作头的一种机械化工具称为电动工具,它是用手握持操作,以小功率电动机或电磁铁作为动力,通过传动机构来驱动作业工作头的工具,无线电动都附带了一比亚迪唐dm真的香总结结论就是唐真香!我朋友是在20年买的唐dm试驾试的是燃油版的,买的是dm目前车子已经跑了差不多三万公里,暂时没有遇到大问题。表显耗油百公里十左右。高速一百左右定速巡航,可以跑到从长远出发,商人王健林凭借敏锐嗅觉为万达开辟新路古往今来,成大事者必有定是目光长远。有大格局的人,目光长远的人,凡事都会多想一步,不会只看到眼前利益,而是从长远考虑出发来做事情。目光长远的人才能抓住机遇和挑战,因为他们不是在预估
英特尔酷睿I7魔改处理器仅300多元?内幕BUG你了解多少?魔改的处理器细节内幕本身太过繁杂,比如10750H(QTJ2)这款处理器的细节根本没什么人发布(魔改君实测文章大家自己翻阅即可),更多的人只看到了它的存在,却不知道它的缺点,以及温1200元英特尔9代E3处理器最后的绝唱!神教最后的坚守英特尔的E3处理器从发布以来,到2019年第二季度,就戛然而止了。目前可以买到最顶级的E3处理器就是第九代的E2288G处理器,而这代志强处理器,原配的C240芯片组系列主板依然还0。9V电压英特尔I7处理器你见过吗?100元技嘉主板带不动犹豫粉丝不幸跟进魔改君入手了一个M40的ITX小机箱于是开始寻求性价比高的CPU主板套装无奈2278G频繁售罄,总是抢不到,另外,Z370B365也很少有MATX的小主板(标准尺寸年报华夏信用卡2020年业绩,累计发卡超2700万张刚刚华夏银行2020年报发布,华夏信用卡2020年业绩也一并出炉,至此2020年度主要发卡银行信用卡业绩全部披露完毕。华夏信用卡累计发卡2701。51万张,较上年末增长10。9有效Axure原型模版RP文件资料包AxureRP原型整理资料全集,包括AxureRP原型400多个,元件库13个。PM产品经理Axure元件及原型地图元件部分5013最全的Web设计Axure元件库5012数据图表一颗月销40000的蛋,让旧冰箱焕发第二春去味杀菌又保鲜很多人家的冰箱可能一年到头都不清理一次。隔夜的剩菜,长毛的柿子发芽的土豆,一打开跟生化武器一样,味道让人上头!很多看似干净的冰箱里面却悄悄藏着700多种细菌,难怪家里的老人和孩子总298元的INTEL酷睿I77700K真实使用情况,内存坑随着水晶家带盖子的笔记本ES版不显的7700K处理器(也就是QL3X)再次供货,魔改君也自然又为粉丝服务了一波,今天给大家聊聊新的发现新的感想!一,真实的,建议的,稳定的,实际的使亚马逊卖爆的电脑支架,在中国只要68就能入手!简直是办公神器因为长时间伏案在电脑前,我弯了脖子不自然地向前倾斜驼背,下巴以下肩膀以上不忍直视,整个人看起来很没气质。每次坐在电脑前总以为自己的姿势是这样的。事实上你是这样的。事实上,电脑脖问题拧不开瓶盖?用四合一开瓶器1秒就搞定了,三种卡口随意切换!拧瓶盖,对女生来说是个力气活。之前微博上曾经轰轰烈烈讨论过,陌生女生求助开瓶盖,男朋友究竟该不该帮。有的人觉得求助的女生矫情,瓶盖有什么拧不开的。小编只想说,naive,有的瓶盖就从冯赵离婚这件事可以发现,赵丽颖可真不简单大家好,我是老李。今天和大家聊聊前阵子娱乐圈的大事冯绍峰赵丽颖离婚一事。老粉丝都知道老李我是卖保险的,猜测我是不是又要从资产保护,保险的重要性来聊起了。一般的保险自媒体会聊这些,可2年赚11倍?我要20年赚8000倍大家好,我是老李。今天和大家聊聊投资界的传奇。2年赚11倍,这个投资是不是已经很不错了?那老李我告诉你,如果你来接这个11倍的盘,然后一直持有20年,收益最终将是8000倍!这个投