SpringBoot中Excel表的导入、导出功能的实现
文章目录
- 一、easyExcel简介
- 二、Excel表的导出
- 2.1 添加 Maven 依赖
- 2.2 创建导出数据的实体类
- 4. 编写导出接口
- 5. 前端代码
- 6. 实现效果
- 三、excel表的导出
- 1. Excel表导入的整体流程
- 1.1 配置文件存储路径
- 2. 前端实现
- 2.1 文件上传组件
- 2.2 文件上传逻辑
- 3. 后端实现
- 3.1 文件上传接口
- 3.2 数据解析接口
- 4. 实现效果
一、easyExcel简介
Excel表的导入导出有很多种方式,这里我们使用easyExel。EasyExcel 是阿里巴巴推出的一个处理 Excel 文件的库,特别适合大数据量的 Excel 文件操作,具有性能优越、内存占用小等特点。
二、Excel表的导出
集成 EasyExcel 到 Spring Boot 项目:
2.1 添加 Maven 依赖
首先,在 pom.xml 中添加 EasyExcel 的依赖:
com.alibaba easyexcel 3.0.6
2.2 创建导出数据的实体类
根据需要创建实体类,使用@ExcelProperty注解标注实体类的字段,指定表头名称和列索引,EasyExcel 会根据这个类的字段和注解来生成 Excel 文件。
@Data public class PersonVO { @ExcelProperty(value = "人员ID", index = 0) private Integer personId; @ExcelIgnore private Integer communityId; @ExcelProperty(value = "单元名称", index = 2) private String termName; @ExcelProperty(value = "房号", index = 3) private String houseNo; @ExcelProperty(value = "姓名", index = 4) private String userName; @ExcelProperty(value = "性别", index = 5) private String sex; @ExcelProperty(value = "手机号", index = 6) private String mobile; @ExcelIgnore private String faceUrl; @ExcelProperty(value = "居住性质", index = 7) private String personType; @ExcelIgnore private Integer state; @ExcelIgnore private String creater; @ExcelIgnore private Date createTime; @ExcelProperty(value = "备注", index = 8) private String remark; @ExcelProperty(value = "社区名称", index = 1) private String communityName; }
不需要导出的列使用@ExcelIgnore忽略
4. 编写导出接口
@RestController public class ExcelController { @GetMapping("/exportExcel") public Result exportExcel(PersonListForm personListForm){ //查询数据 PageVO pageVO = this.personService.personList(personListForm); List list = pageVO.getList(); // 设置文件路径和文件名 String path = "D:/community/excel_export/"; String fileName = path + "personInfo_" + System.currentTimeMillis() + ".xlsx"; // 使用 EasyExcel 导出数据 EasyExcel.write(fileName, PersonVO.class) .sheet("人员信息") .doWrite(list); // 直接写入数据 return Result.ok().put("data", fileName); } }
5. 前端代码
//导出按钮 导出 handleExcel() { this.$confirm('是否确认导出所有数据项?').then(() => { exportExcel(this.listQuery).then(res => { const fileUrl = process.env.VUE_APP_BASE_API + '/sys/person/exportExcel?fileName=' + res.data; const link = document.createElement('a'); link.href = fileUrl; link.download = res.data; // 下载文件的名称 link.click(); }); }).catch(() => {}); }
6. 实现效果
三、excel表的导出
1. Excel表导入的整体流程
前端部分:
- 用户通过上传组件选择Excel文件。
- 文件上传到后端服务器。
- 后端返回文件路径或标识符。
- 前端调用解析接口,将文件路径传递给后端。
- 后端解析Excel文件,将数据保存到数据库。
- 返回解析结果给前端,提示用户成功或失败信息。
后端部分:
- 提供文件上传接口,接收Excel文件并保存到服务器。
- 提供解析接口,读取Excel文件内容并处理数据。
- 将解析的数据保存到数据库。
- 返回解析结果。
1.1 配置文件存储路径
确保文件存储路径是动态配置的,避免硬编码。可以在application.yml中配置文件存储路径:
upload: excel: D:/community/upload/excel/
在代码中读取配置:
@Value("${upload.excel}") private String excel;
2. 前端实现
2.1 文件上传组件
使用Element UI的el-upload组件实现文件上传功能。
点击下载Excel模板
2.2 文件上传逻辑
在beforeAvatarUpload方法中,限制文件类型和大小
beforeAvatarUpload(file) { this.errorInfo = ''; const ext = file.name.substring(file.name.lastIndexOf('.') + 1).toLowerCase(); const imgSize = file.size / 1024 / 1024
在handleAvatarSuccess方法中,处理上传成功后的逻辑:
handleAvatarSuccess(response, file) { if (response && response.code === 200) { parsefile(response.data).then(res => { if (res && res.code === 200) { if (res.status === 'success') { this.errorInfo = res.data; this.$message.success('上传成功'); } else { this.errorInfo = res.data; this.$message.error('上传失败'); } } else { this.errorInfo = '解析文件失败'; this.$message.error('解析文件失败'); } }).catch(error => { console.error('解析文件失败', error); this.errorInfo = '解析文件失败'; this.$message.error('解析文件失败'); }); } else { this.errorInfo = '文件上传失败'; this.$message.error('文件上传失败'); } }
3. 后端实现
3.1 文件上传接口
接收上传的Excel文件,并保存到服务器的临时目录中:
@PostMapping("/excelUpload") public Result excelUpload(@RequestParam("uploadExcel") MultipartFile file) throws Exception { if (file.getOriginalFilename().equals("")) { return Result.error("没有选中要上传的文件"); } else { String picName = UUID.randomUUID().toString(); String oriName = file.getOriginalFilename(); String extName = oriName.substring(oriName.lastIndexOf(".")); String newFileName = picName + extName; File targetFile = new File(excel, newFileName); // 保存文件 file.transferTo(targetFile); return Result.ok().put("data", newFileName); } }
3.2 数据解析接口
读取Excel文件内容,解析数据并保存到数据库:
@LogAnnotation("导入数据") @PostMapping("/parsefile/{fileName}") public Result parsefile(@PathVariable("fileName") String fileName, HttpSession session) { User user = (User) session.getAttribute("user"); try { String basePath = excel + fileName; List dataList = EasyExcel.read(new File(basePath), ExcelVo.class).sheet().doReadSync(); for (ExcelVo vo : dataList) { Person single = new Person(); single.setPersonId(0); single.setState(1); single.setFaceUrl(""); single.setCommunityId(vo.getCommunityId()); single.setTermName(vo.getTermName()); single.setHouseNo(vo.getHouseNo()); single.setUserName(vo.getUserName()); single.setSex(vo.getSex()); single.setMobile(vo.getMobile()); single.setPersonType(vo.getPersonType()); single.setRemark(vo.getRemark()); single.setCreater(user.getUsername()); this.personService.save(single); } return Result.ok().put("status", "success").put("data", "数据导入完成!"); } catch (Exception e) { e.printStackTrace(); return Result.error().put("status", "fail").put("data", "解析文件失败:" + e.getMessage()); } }
4. 实现效果
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。