当前位置:   article > 正文

EasyExcel 操作excel导入导出_easyexcel导出excel文件

easyexcel导出excel文件

目录

1、核心依赖

2、导出

前端:一个小页面

后端 

实体类

controller 

dao.xml

sql

效果

导入

前端

后端

实体类(加校验注解)

controller

util包

dao.xml

效果


1、核心依赖

  1. <!-- easyExcel -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>easyexcel</artifactId>
  5. <version>2.2.6</version>
  6. </dependency>

2、导出

前端:一个小页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>excel导入导出</title>
  6. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  7. </head>
  8. <body>
  9. <button id="easyExcelBtn" type="button" >
  10. 下载列表数据easyExcel
  11. </button>
  12. <script>
  13. /**
  14. * easyExce导出
  15. */
  16. //给"批量导出"按钮添加单击事件
  17. $("#easyExcelBtn").click(function () {
  18. //发送同步请求
  19. window.location.href="easyExcel/write";
  20. });
  21. </script>
  22. </body>
  23. </html>

后端 

实体类

  1. /**
  2. * 校验
  3. */
  4. @Data
  5. @NoArgsConstructor
  6. @AllArgsConstructor
  7. public class EasySysUser {
  8. //
  9. @ExcelProperty("用户账号")
  10. private String userName;
  11. @ExcelProperty("用户昵称")
  12. private String nickName;
  13. @ExcelProperty("用户邮箱")
  14. private String email;
  15. @ExcelProperty("手机号码")
  16. private String phonenumber;
  17. @ExcelProperty("用户性别")
  18. private Integer sex;
  19. @ExcelProperty("帐号状态(0正常 1停用)")
  20. private Integer status;
  21. /**
  22. * 忽略这个字段
  23. * @ExcelIgnore
  24. */
  25. @ExcelProperty("删除标志(0代表存在 2代表删除)")
  26. private Integer delFlag;
  27. }

controller 

为了方便我就把代码业务都写这了。

 

  1. @Autowired
  2. ExcelService excelService;
  3. @GetMapping("easyExcel/write")
  4. public void easyExcelWrite(HttpServletResponse response){
  5. //查询到数据库中的数据
  6. List<EasySysUser> users = excelService.poiExcelWrite();
  7. OutputStream outputStream = null;
  8. try {
  9. String fileName = URLEncoder.encode("用户表", StandardCharsets.UTF_8.name());//文件名
  10. response.setContentType("application/octet-stream;charset=UTF-8");
  11. response.setCharacterEncoding("utf-8");
  12. response.addHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".xls");
  13. outputStream = response.getOutputStream();
  14. // 流 , 数据类型 表 数据
  15. EasyExcel.write(outputStream, EasySysUser.class).sheet("1").doWrite(users);
  16. } catch (IOException e) {
  17. e.printStackTrace();
  18. } finally {
  19. if (outputStream != null) {
  20. try {
  21. outputStream.flush();//刷新流:通道中数据全部输出
  22. outputStream.close();//关闭流
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. }

dao.xml

  1. <select id="poiExcelWrite" resultType="com.zoubin.easyexcel.web.entity.EasySysUser">
  2. SELECT user_name username,nick_name nickname,email,phonenumber,sex,status,del_flag delflag from sys_user;
  3. </select>

sql

  1. CREATE TABLE `sys_user` (
  2. `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  3. `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
  4. `user_name` varchar(30) NOT NULL COMMENT '用户账号',
  5. `nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
  6. `user_type` varchar(2) DEFAULT '00' COMMENT '用户类型(00系统用户)',
  7. `email` varchar(50) DEFAULT '' COMMENT '用户邮箱',
  8. `phonenumber` varchar(11) DEFAULT '' COMMENT '手机号码',
  9. `sex` char(1) DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
  10. `avatar` varchar(100) DEFAULT '' COMMENT '头像地址',
  11. `password` varchar(100) DEFAULT '' COMMENT '密码',
  12. `status` char(1) DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
  13. `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
  14. `login_ip` varchar(128) DEFAULT '' COMMENT '最后登录IP',
  15. `login_date` datetime DEFAULT NULL COMMENT '最后登录时间',
  16. `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
  17. `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  18. `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
  19. `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  20. `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  21. PRIMARY KEY (`user_id`)
  22. ) ENGINE=InnoDB AUTO_INCREMENT=158 DEFAULT CHARSET=utf8 COMMENT='用户信息表'

效果

 

 

导入

前端

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>excel导入导出</title>
  6. <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  7. </head>
  8. <body>
  9. <button id="easyExcelBtn" type="button" >
  10. 下载列表数据easyExcel
  11. </button>
  12. <hr/>
  13. <!-- 导入市场活动的模态窗口 -->
  14. <div class="modal fade" id="importActivityModal3" role="dialog">
  15. <div class="modal-dialog" role="document" style="width: 85%;">
  16. <div class="modal-content">
  17. <div class="modal-header">
  18. <h4 class="modal-title" id="myModalLabel3">导入EasyExcel校验测试</h4>
  19. </div>
  20. <div class="modal-body" style="height: 350px;">
  21. <div style="position: relative;top: 20px; left: 50px;">
  22. 请选择要上传的文件:<small style="color: gray;">[仅支持.xls]</small>
  23. </div>
  24. <div style="position: relative;top: 40px; left: 50px;">
  25. <input type="file" id="activityFile3">
  26. </div>
  27. <div style="position: relative;top: 60px; left: 50px;">
  28. <button id="importActivityBtn3" type="button" class="btn btn-primary">导入</button>
  29. </div>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. <script>
  35. /**
  36. * easyExce导出
  37. */
  38. //给"批量导出"按钮添加单击事件
  39. $("#easyExcelBtn").click(function () {
  40. //发送同步请求
  41. window.location.href="easyExcel/write";
  42. });
  43. /**
  44. * EasyExcel导入 校验
  45. */
  46. //给"导入"按钮添加单击事件
  47. $("#importActivityBtn3").click(function () {
  48. //收集参数
  49. //——xls文件获取的是文件名
  50. var activityFileName=$("#activityFile3").val();
  51. var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//xls,XLS,Xls,xLs,....截取字符串后缀,toLocaleLowerCase():转小写
  52. if(suffix!="xls"){
  53. alert("只支持xls文件");
  54. return;
  55. }
  56. //——获取文件内容
  57. var activityFile=$("#activityFile3")[0].files[0];
  58. //if(activityFile.size>5*1024*1024){//activityFile.size:获取文件大小
  59. // alert("文件大小不超过5MB");
  60. // return;
  61. //}
  62. //FormData是ajax提供的接口,可以模拟键值对向后台提交参数;
  63. //FormData最大的优势是不但能提交文本数据,还能提交二进制数据
  64. var formData=new FormData();
  65. formData.append("activityFile",activityFile);
  66. //发送请求
  67. $.ajax({
  68. url:'/EasyExcel/readCheck',
  69. data:formData,
  70. processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
  71. contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
  72. type:'post',
  73. dataType:'json',
  74. success:function (data) {
  75. if(data.code=="1"){
  76. //提示成功导入记录条数
  77. alert("成功导入"+data.retData+"条记录");
  78. //关闭模态窗口
  79. $("#importActivityModal3").modal("hide");
  80. }else{
  81. //提示信息
  82. alert(data.message);
  83. //模态窗口不关闭
  84. $("#importActivityModal3").modal("show");
  85. }
  86. }
  87. });
  88. });
  89. </script>
  90. </body>
  91. </html>

后端

实体类(加校验注解)

  1. package com.zoubin.easyexcel.web.entity;
  2. import com.alibaba.excel.annotation.ExcelProperty;
  3. import lombok.AllArgsConstructor;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. import javax.validation.constraints.Email;
  7. import javax.validation.constraints.NotEmpty;
  8. /**
  9. * 校验
  10. */
  11. @Data
  12. @NoArgsConstructor
  13. @AllArgsConstructor
  14. public class EasySysUser {
  15. @NotEmpty(message = "用户名称不能为空")
  16. @ExcelProperty("用户账号")
  17. private String userName;
  18. @NotEmpty(message = "用户昵称不能为空")
  19. @ExcelProperty("用户昵称")
  20. private String nickName;
  21. // @Pattern(regexp="[a-za-z0-9._%+-]+@[a-za-z0-9.-]+\\.[a-za-z]{2,4}", message="邮件格式错误")
  22. @Email(message = "邮箱格式不正确")
  23. @ExcelProperty("用户邮箱")
  24. private String email;
  25. @NotEmpty(message = "手机号码不能为空")
  26. @ExcelProperty("手机号码")
  27. private String phonenumber;
  28. @ExcelProperty("用户性别")
  29. private Integer sex;
  30. @ExcelProperty("帐号状态(0正常 1停用)")
  31. private Integer status;
  32. @ExcelProperty("删除标志(0代表存在 2代表删除)")
  33. /**
  34. * 忽略这个字段
  35. * @ExcelIgnore
  36. */
  37. private Integer delFlag;
  38. }

controller

  1. /**
  2. * 导入
  3. * 数据校验并返回错误
  4. * @param activityFile
  5. * @return
  6. */
  7. @PostMapping("/EasyExcel/readCheck")
  8. @ResponseBody
  9. public Object easyExcelReadCheck(MultipartFile activityFile) {
  10. ReturnObject returnObject = new ReturnObject();//响应数据
  11. InputStream inputStream = null;
  12. try {
  13. //获取文件流
  14. inputStream = activityFile.getInputStream();
  15. // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
  16. UserListener userListener = new UserListener();
  17. // 流 数据类型 导入数据监听器
  18. EasyExcel.read(inputStream, EasySysUser.class, userListener).sheet().doRead();
  19. //获取监听收集的数据
  20. List<EasySysUser> dataList = userListener.getDataList();
  21. //文件中有数据
  22. if (!dataList.isEmpty()){
  23. //进行数据校验
  24. List<String> valid = ValidationUtil02.valid(dataList);
  25. if (!valid.isEmpty()){//校验不为空就说明有错误数据
  26. for (String s:valid){
  27. System.out.println(s);//打印错误
  28. }
  29. //向前端返回错误信息
  30. returnObject.setCode("500");//失败
  31. returnObject.setMessage(valid.toString());
  32. return returnObject;
  33. }
  34. }else {
  35. return null;
  36. }
  37. //没有问题调用service层方法,保存用户
  38. int ret = excelService.saveUsers(dataList);
  39. returnObject.setCode("1");//成功
  40. returnObject.setRetData(ret);
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. returnObject.setCode("500");//失败
  44. returnObject.setMessage("系统忙,请稍后重试....");
  45. } finally {
  46. if (inputStream != null) {
  47. try {
  48. inputStream.close();//关闭流
  49. } catch (IOException e) {
  50. e.printStackTrace();
  51. }
  52. }
  53. }
  54. return returnObject;
  55. }

util包

ReturnObject :返回响应信息

  1. @Data
  2. public class ReturnObject {
  3. private String code;//返回的编码
  4. private String message;//返回的提示信息
  5. private Integer retData;//返回条数
  6. }

 UserListener :EasyExcel导入监听器,获取导入数据

  1. @Component
  2. public class UserListener extends AnalysisEventListener<EasySysUser> {
  3. //保存数据
  4. List<EasySysUser> dataList = new ArrayList<>();;
  5. //读取表头的内容
  6. @Override
  7. public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
  8. // System.out.println("表头->"+headMap);
  9. }
  10. //一行一行读取excel中的内容
  11. @Override
  12. public void invoke(EasySysUser user, AnalysisContext context) {
  13. dataList.add(user);
  14. }
  15. //读取完成之后执行的方法
  16. @Override
  17. public void doAfterAllAnalysed(AnalysisContext context) {
  18. }
  19. public List<EasySysUser> getDataList() {
  20. return dataList;
  21. }
  22. }

 ValidationUtil02 : 数据校验工具类

  1. /**
  2. * 数据校验工具
  3. */
  4. public class ValidationUtil02 {
  5. //校验对象(线程安全)
  6. static Validator validator;
  7. //初始化
  8. static {
  9. validator = Validation.buildDefaultValidatorFactory().getValidator();
  10. }
  11. //校验方法
  12. public static List<String> valid(List<EasySysUser> value){
  13. //校验错误信息
  14. List<String> errorResult = new ArrayList<>();
  15. //初始行数
  16. int row = 2;
  17. for (EasySysUser user : value){
  18. //如果没有校验通过,就会有校验信息
  19. Set<ConstraintViolation<Object>> validate = validator.validate(user);// 进行校验
  20. if (!validate.isEmpty()){
  21. int finalRow = row;
  22. List<String> collect = validate.stream().map(v ->
  23. "第"+ finalRow +"行--"+
  24. "属性:" + v.getPropertyPath() +
  25. ",属性的值:" + v.getInvalidValue() +
  26. ",校验不通过的提示信息:" + v.getMessage())
  27. .collect(Collectors.toList());
  28. errorResult.add(collect.toString());
  29. }
  30. ++row;
  31. }
  32. return errorResult;
  33. }
  34. // //测试
  35. // public static void main(String[] args) {
  36. // EasySysUserCheck user = new EasySysUserCheck();
  37. // user.setNickName("你好");
  38. // List<String> valid = ValidationUtil.valid(user);
  39. // System.out.println(valid);
  40. //
  41. //
  42. // }
  43. }

dao.xml

  1. <insert id="saveUsers">
  2. insert into sys_user(user_name,nick_name,email,phonenumber,sex,status,del_flag)
  3. values
  4. <foreach collection="list" item="obj" separator=",">
  5. (#{obj.userName},#{obj.nickName},#{obj.email},#{obj.phonenumber},#{obj.sex},#{obj.status},#{obj.delFlag})
  6. </foreach>
  7. </insert>

效果

错误数据

 

选择文件进行导入

 

 

 

准备正确数据

 

 

 本文还是有许多不足的,欢迎指正。

 可以试着去进行优化,提高拓展和复用性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/321570?site
推荐阅读
相关标签
  

闽ICP备14008679号