当前位置:   article > 正文

Spring boot整合EasyExcel导入excel文件到数据库(复制粘贴就可以使用)_springboot 整合导入excel 博客

springboot 整合导入excel 博客

第一步,引入EasyExcel坐标

  1. <!-- easyexcel 这里我使用的是2.1.6稳定版本 -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>easyexcel</artifactId>
  5. <version>2.1.6</version>
  6. </dependency>

第一个功能,编写导入excel到数据库接口代码

1.实体类,主要使用@ExcelProperty注解,推荐使用name属性,直接名称匹配

  1. package com.xx.devicemanagement.lighting.domain;
  2. import com.alibaba.excel.annotation.ExcelIgnore;
  3. import com.alibaba.excel.annotation.ExcelProperty;
  4. import com.baomidou.mybatisplus.annotation.TableField;
  5. import lombok.AllArgsConstructor;
  6. import lombok.Data;
  7. import lombok.NoArgsConstructor;
  8. import lombok.ToString;
  9. import com.baomidou.mybatisplus.annotation.IdType;
  10. import com.baomidou.mybatisplus.annotation.TableId;
  11. import java.io.Serializable;
  12. import java.util.Date;
  13. import io.swagger.annotations.ApiModel;
  14. import io.swagger.annotations.ApiModelProperty;
  15. /**
  16. * 照明设备管理对象 device_lighting
  17. *
  18. */
  19. @Data
  20. @NoArgsConstructor
  21. @AllArgsConstructor
  22. @ToString
  23. @ApiModel("照明设备管理实体类")
  24. public class DeviceLighting implements Serializable {
  25. private static final long serialVersionUID=1L;
  26. @ExcelIgnore
  27. @TableId(type = IdType.ASSIGN_ID)
  28. @ApiModelProperty(value = "id")
  29. /** id */
  30. private String id;
  31. /** 设备编号 */
  32. @ExcelProperty(value = "设备编号")
  33. @ApiModelProperty(value = "设备编号")
  34. private String equipmentNumber;
  35. /** 设备名称 */
  36. @ExcelProperty(value = "设备名称")
  37. @ApiModelProperty(value = "设备名称")
  38. private String equipmentName;
  39. /** 铭牌码 */
  40. @ExcelProperty(value = "铭牌码")
  41. @ApiModelProperty(value = "铭牌码")
  42. private String pmCode;
  43. /** 设备终端 */
  44. @ExcelProperty(value = "设备终端")
  45. @ApiModelProperty(value = "设备终端")
  46. private String lightingType;
  47. /** 照明数量 */
  48. @ExcelProperty(value = "照明数量")
  49. @ApiModelProperty(value = "照明数量")
  50. private Long lightingNumber;
  51. /** 场景ID */
  52. @ExcelProperty(value = "场景ID")
  53. @ApiModelProperty(value = "场景ID")
  54. private String sceneId;
  55. /** 创建时间 */
  56. @ExcelIgnore
  57. private Date createTime;
  58. /** 更新时间 */
  59. @ExcelIgnore
  60. private Date updateTime;
  61. /** 创建人 */
  62. @ExcelIgnore
  63. private String createBy;
  64. /** 更新人 */
  65. @ExcelIgnore
  66. private String updateBy;
  67. /** 楼栋字典值(1:综合楼,2:病房楼...) */
  68. @ExcelProperty(value = "楼栋")
  69. @ApiModelProperty(value = "楼栋字典值")
  70. private String buildingCode;
  71. /** 楼层字典值(1:1F,2:2F,3:3F,4:4F.....) */
  72. @ExcelProperty(value = "楼层")
  73. @ApiModelProperty(value = "楼层字典值(1:1F,2:2F,3:3F,4:4F.....)")
  74. private String floorCode;
  75. /** 区域字典值(1:A区域,2:B区域,3:C区域........) */
  76. @ExcelProperty(value = "区域")
  77. @ApiModelProperty(value = "区域字典值(1:A区域,2:B区域,3:C区域........)")
  78. private String regionCode;
  79. /**
  80. * 开始时间
  81. */
  82. @ApiModelProperty(value = "开始时间")
  83. @TableField(exist = false)
  84. @ExcelIgnore
  85. private Date startTime;
  86. /**
  87. * 结束时间
  88. */
  89. @ApiModelProperty(value = "结束时间")
  90. @TableField(exist = false)
  91. @ExcelIgnore
  92. private Date endTime;
  93. /**
  94. * 当前页
  95. */
  96. @ApiModelProperty(value = "当前页")
  97. @TableField(exist = false)
  98. @ExcelIgnore
  99. private Integer pageNum;
  100. /**
  101. * 每页显示条数
  102. */
  103. @ApiModelProperty(value = "每页显示条数")
  104. @TableField(exist = false)
  105. @ExcelIgnore
  106. private Integer pageSize;
  107. }

2.接口层:

  1. /**
  2. * 导入照明设备管理的excel列表
  3. */
  4. @ApiOperation("导入照明设备管理的excle列表")
  5. @PostMapping("/uploadExcel")
  6. public void uploadExcel(MultipartFile file) {
  7. EasyExcelUtils<DeviceLighting> easyExcelUtils = new EasyExcelUtils<>();
  8. easyExcelUtils.importExcel(file, DeviceLighting.class, new DeviceLightingListeners(deviceLightingService));
  9. }

3.监听器(easyexcel是在监听器层完成excel数据读取):

  1. package com.xx.devicemanagement.lighting.listeners;
  2. import com.alibaba.excel.context.AnalysisContext;
  3. import com.alibaba.excel.event.AnalysisEventListener;
  4. import com.alibaba.fastjson.JSON;
  5. import com.xr.devicemanagement.lighting.domain.DeviceLighting;
  6. import com.xr.devicemanagement.lighting.service.IDeviceLightingService;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. /**
  12. * 照明设备管理Controller
  13. */
  14. public class DeviceLightingListeners extends AnalysisEventListener<DeviceLighting> {
  15. private static final Logger logger =
  16. LoggerFactory.getLogger(DeviceLightingListeners.class);
  17. /**
  18. * 每隔200条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
  19. */
  20. private static final int BATCH_COUNT = 200;
  21. List<DeviceLighting> list = new ArrayList<>();
  22. /**
  23. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
  24. */
  25. private IDeviceLightingService deviceLightingService;
  26. /**
  27. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
  28. */
  29. public DeviceLightingListeners(IDeviceLightingService deviceLightingService) {
  30. this.deviceLightingService = deviceLightingService;
  31. }
  32. /**
  33. * 这个每一条数据解析都会来调用
  34. */
  35. @Override
  36. public void invoke(DeviceLighting deviceLighting, AnalysisContext analysisContext) {
  37. logger.info("invoke方法被调用");
  38. logger.info("解析到一条数据:{}", JSON.toJSONString(deviceLighting));
  39. list.add(deviceLighting);
  40. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
  41. if (list.size() >= BATCH_COUNT) {
  42. saveData();
  43. // 存储完成清理 list
  44. list.clear();
  45. }
  46. }
  47. /**
  48. * 所有数据解析完成了 都会来调用
  49. *
  50. * @param context
  51. */
  52. @Override
  53. public void doAfterAllAnalysed(AnalysisContext context) {
  54. System.out.println("doAfterAllAnalysed方法 被调用");
  55. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
  56. saveData();
  57. logger.info("所有数据解析完成!");
  58. }
  59. /**
  60. * 加上存储数据库
  61. */
  62. private void saveData() {
  63. logger.info("{}条数据,开始存储数据库!", list.size());
  64. deviceLightingService.saveList(list);
  65. logger.info("存储数据库成功!");
  66. }
  67. }

4.service接口层:

  1. /**
  2. * 批量插入excel文件的内容
  3. * @param list
  4. * @return
  5. */
  6. public int saveList(List<DeviceLighting> list);

5.service接口实现:

  1. /**
  2. * excel导入
  3. *
  4. * @param list
  5. * @return
  6. */
  7. @Override
  8. public int saveList(List<DeviceLighting> list) {
  9. deviceLightingMapper.saveList(list);
  10. }
  11. return 0;
  12. }

6.数据库mapper接口和sql实现:

  1. //接口方法定义
  2. /**
  3. * 导入excel
  4. * @param list
  5. * @return
  6. */
  7. public int saveList(List<DeviceLighting> list);
  8. //mybatis的xmlsql实现
  9. <insert id="saveList">
  10. insert into device_lighting values
  11. <foreach item="item" index="index" collection="list" separator=",">
  12. ( #{item.id}, #{item.equipmentNumber}, #{item.equipmentName}, #{item.pmCode}, #{item.lightingType}, #{item.lightingNumber}, #{item.sceneId}, #{item.createTime}, #{item.updateTime}, #{item.createBy}, #{item.updateBy}, #{item.buildingCode}, #{item.floorCode}, #{item.regionCode})
  13. </foreach>
  14. </insert>

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

闽ICP备14008679号