• 基于poi 3.17导入excel文件 含处理字典项转换为状态


    excel 文件下拉框字典项

    要转换为数据库状态

    fault_code为字符串类型

    一般通过后端处理

    写一个监听器类,处理从流中得到的数据

    有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

    1. import com.alibaba.excel.context.AnalysisContext;
    2. import com.alibaba.excel.event.AnalysisEventListener;
    3. import com.alibaba.fastjson.JSON;
    4. import com.wedu.modules.app.entity.UserEntity;
    5. import com.wedu.modules.fault.entity.Register;
    6. import com.wedu.modules.fault.mapper.RegisterMapper;
    7. import com.wedu.modules.fault.service.IRegisterService;
    8. import com.wedu.modules.sys.entity.SysDictEntity;
    9. import com.wedu.modules.sys.entity.SysUserEntity;
    10. import com.wedu.modules.sys.service.SysDictService;
    11. import com.wedu.modules.sys.service.SysUserService;
    12. import org.slf4j.Logger;
    13. import org.slf4j.LoggerFactory;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. import java.util.ArrayList;
    16. import java.util.Date;
    17. import java.util.List;
    18. import static com.wedu.modules.fault.util.TimeConversionStringUtil.*;
    19. import static com.wedu.common.utils.ShiroUtils.getUserId;
    20. // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
    21. public class UploadDataListener extends AnalysisEventListener {
    22. private static final Logger LOGGER = LoggerFactory.getLogger(UploadDataListener.class);
    23. /**
    24. * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
    25. */
    26. private static final int BATCH_COUNT = 5;
    27. List list = new ArrayList<>();
    28. /**
    29. * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
    30. */
    31. private IRegisterService registerService;
    32. private SysUserService userService;
    33. private SysDictService dictService;
    34. // public UploadDataListener() {
    35. // // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
    36. // demoDAO = new DemoDAO();
    37. // }
    38. /**
    39. * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
    40. *
    41. * @param registerService
    42. */
    43. public UploadDataListener(IRegisterService registerService,SysUserService userService, SysDictService dictService) {
    44. this.registerService = registerService;
    45. this.userService = userService;
    46. this.dictService = dictService;
    47. }
    48. /**
    49. * 这个每一条数据解析都会来调用
    50. *
    51. * @param data
    52. * one row value. Is is same as {@link }
    53. * @param context
    54. */
    55. @Override
    56. public void invoke(Register data, AnalysisContext context) {
    57. LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
    58. list.add(data);
    59. // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM
    60. if (list.size() >= BATCH_COUNT) {
    61. saveData();
    62. // 存储完成清理 list
    63. list.clear();
    64. }
    65. }
    66. /**
    67. * 所有数据解析完成了 都会来调用
    68. *
    69. * @param context
    70. */
    71. @Override
    72. public void doAfterAllAnalysed(AnalysisContext context) {
    73. // 这里也要保存数据,确保最后遗留的数据也存储到数据库
    74. saveData();
    75. LOGGER.info("所有数据解析完成!");
    76. }
    77. /**
    78. * 加上存储数据库
    79. */
    80. private void saveData() {
    81. LOGGER.info("{}条数据,开始存储数据库!", list.size());
    82. // List userEntityList = new ArrayList<>();
    83. // 获取字典字符列表
    84. List dictEntities = dictService.maintenanceList("faultCode");
    85. for (Register register : list) {
    86. //处理时间字符串为时间戳
    87. long redTime = convertToMilliseconds(register.getRedTimeChar());
    88. register.setRedTime(redTime);
    89. long repTime = convertToMilliseconds(register.getRepTimeChar());
    90. register.setRepTime(repTime);
    91. register.setCreateTime(new Date());
    92. register.setCreateBy(getUserId());
    93. // 遍历字典和实体类进行比对然后重新赋值
    94. for (SysDictEntity dictEntity : dictEntities) {
    95. if (dictEntity.getName().equals(register.getFaultCode())) {
    96. register.setFaultCode(dictEntity.getValue());
    97. }
    98. }
    99. // 为了关联表的插入,模拟实现插入用户
    100. // // 检查用户名是否已存在
    101. // boolean usernameExists = userService.checkUsernameExists(register.getSysUsername());
    102. //
    103. // if (!usernameExists) {
    104. // SysUserEntity user = new SysUserEntity();
    105. // // 取出user表必要信息,设置信息必要的属性
    106. // user.setUsername(register.getSysUsername());
    107. // user.setMobile(register.getPhone());
    108. // user.setPassword("123");
    109. // user.setStatus(1);
    110. // user.setCreateUserId(getUserId());
    111. // userService.saveUser(user);
    112. userEntityList.add(user);
    113. // }
    114. }
    115. // 执行sql
    116. // 执行用户信息批量插入
    117. // if (!userEntityList.isEmpty()) {
    118. // userService.saveBatch(userEntityList);
    119. // }
    120. registerService.saveBatch(list);
    121. LOGGER.info("存储数据库成功!");
    122. }
    123. }

    controller层访问接口

    1. /**
    2. * easy excel上传
    3. * @param file
    4. * @return
    5. * @throws Exception
    6. */
    7. @PostMapping("/importEasyExcel")
    8. public R importEasyExcel(MultipartFile file) throws Exception {
    9. // 测试获取数据
    10. // String fileName = "C:\\Users\\HP\\Desktop\\ey导出.xlsx";
    11. // List list = EasyExcel.read(fileName).head(Register.class).sheet().doReadSync();
    12. // for (Register data : list) {
    13. // System.out.println("读取到数据:{}" + JSON.toJSONString(data));
    14. // }
    15. EasyExcel.read(file.getInputStream(), Register.class, new UploadDataListener(registerService, userService, dictService)).sheet().doRead();
    16. return R.ok();
    17. }

    前端:使用element组件的上传方法

    使用异步Ajax方法

    按钮绑定方法

    1. class="upload-demo"
    2. action="#"
    3. :on-change="handleChange"
    4. :on-exceed="handleExceed"
    5. :file-list="fileList"
    6. :limit="1"
    7. multiple
    8. :auto-upload="true"
    9. >
    10. size="small"
    11. round
    12. type="primary"
    13. >点击上传

    methods方法

    1. // 导入excel
    2. // 文件超出个数提示
    3. handleExceed (files, fileList) {
    4. this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
    5. },
    6. handleChange (file) {
    7. let formData = new FormData()
    8. formData.append('file', file.raw) // 传文件
    9. this.$http({
    10. url: this.$http.adornUrl('/register/importEasyExcel'),
    11. method: 'post',
    12. data: formData,
    13. headers: {
    14. 'Content-Type': 'multipart/form-data'
    15. }
    16. }).then(({ data }) => {
    17. if (data && data.code === 0) {
    18. this.$message({
    19. message: '操作成功',
    20. type: 'success',
    21. duration: 1500
    22. })
    23. this.getDataList()
    24. this.$refs.upload.clearFiles() // 清除文件
    25. } else {
    26. this.$message.error(data.msg)
    27. }
    28. })
    29. },

  • 相关阅读:
    做什么数据表格啊,要做就做数据可视化
    电脑重装系统后Word表格自动换行的方法
    基于docker+jenkins+nginx实现一套CI/CD流程
    [运维|数据库] mysql中的READS SQL DATA修饰符说明
    .Net Core AOP之AuthorizeAttribute
    第六章:函数(中)
    基于YOLOv8模型的深海鱼目标检测系统(PyTorch+Pyside6+YOLOv8模型)
    第十一周周报
    从零集成mybatis-plus
    智能电表远程抄表在电力系统中的运用分析
  • 原文地址:https://blog.csdn.net/sumMStar/article/details/136317533