记录一次使用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目前车子已经跑了差不多三万公里,暂时没有遇到大问题。表显耗油百公里十左右。高速一百左右定速巡航,可以跑到
从长远出发,商人王健林凭借敏锐嗅觉为万达开辟新路古往今来,成大事者必有定是目光长远。有大格局的人,目光长远的人,凡事都会多想一步,不会只看到眼前利益,而是从长远考虑出发来做事情。目光长远的人才能抓住机遇和挑战,因为他们不是在预估