
fault_code为字符串类型

一般通过后端处理
有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
-
- import com.alibaba.excel.context.AnalysisContext;
- import com.alibaba.excel.event.AnalysisEventListener;
- import com.alibaba.fastjson.JSON;
- import com.wedu.modules.app.entity.UserEntity;
- import com.wedu.modules.fault.entity.Register;
- import com.wedu.modules.fault.mapper.RegisterMapper;
- import com.wedu.modules.fault.service.IRegisterService;
- import com.wedu.modules.sys.entity.SysDictEntity;
- import com.wedu.modules.sys.entity.SysUserEntity;
- import com.wedu.modules.sys.service.SysDictService;
- import com.wedu.modules.sys.service.SysUserService;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
-
-
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import static com.wedu.modules.fault.util.TimeConversionStringUtil.*;
- import static com.wedu.common.utils.ShiroUtils.getUserId;
-
- // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
- public class UploadDataListener extends AnalysisEventListener
{ - private static final Logger LOGGER = LoggerFactory.getLogger(UploadDataListener.class);
- /**
- * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收
- */
- private static final int BATCH_COUNT = 5;
- List
list = new ArrayList<>(); - /**
- * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。
- */
- private IRegisterService registerService;
-
- private SysUserService userService;
-
- private SysDictService dictService;
-
-
- // public UploadDataListener() {
- // // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
- // demoDAO = new DemoDAO();
- // }
-
- /**
- * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来
- *
- * @param registerService
- */
- public UploadDataListener(IRegisterService registerService,SysUserService userService, SysDictService dictService) {
- this.registerService = registerService;
- this.userService = userService;
- this.dictService = dictService;
- }
-
- /**
- * 这个每一条数据解析都会来调用
- *
- * @param data
- * one row value. Is is same as {@link }
- * @param context
- */
- @Override
- public void invoke(Register data, AnalysisContext context) {
- 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) {
- // 这里也要保存数据,确保最后遗留的数据也存储到数据库
- saveData();
- LOGGER.info("所有数据解析完成!");
- }
-
- /**
- * 加上存储数据库
- */
- private void saveData() {
- LOGGER.info("{}条数据,开始存储数据库!", list.size());
- // List
userEntityList = new ArrayList<>(); - // 获取字典字符列表
- List
dictEntities = dictService.maintenanceList("faultCode"); - for (Register register : list) {
- //处理时间字符串为时间戳
- long redTime = convertToMilliseconds(register.getRedTimeChar());
- register.setRedTime(redTime);
- long repTime = convertToMilliseconds(register.getRepTimeChar());
- register.setRepTime(repTime);
- register.setCreateTime(new Date());
- register.setCreateBy(getUserId());
-
- // 遍历字典和实体类进行比对然后重新赋值
- for (SysDictEntity dictEntity : dictEntities) {
- if (dictEntity.getName().equals(register.getFaultCode())) {
- register.setFaultCode(dictEntity.getValue());
- }
- }
- // 为了关联表的插入,模拟实现插入用户
- // // 检查用户名是否已存在
- // boolean usernameExists = userService.checkUsernameExists(register.getSysUsername());
- //
- // if (!usernameExists) {
- // SysUserEntity user = new SysUserEntity();
- // // 取出user表必要信息,设置信息必要的属性
- // user.setUsername(register.getSysUsername());
- // user.setMobile(register.getPhone());
- // user.setPassword("123");
- // user.setStatus(1);
- // user.setCreateUserId(getUserId());
- // userService.saveUser(user);
- userEntityList.add(user);
- // }
- }
-
- // 执行sql
- // 执行用户信息批量插入
- // if (!userEntityList.isEmpty()) {
- // userService.saveBatch(userEntityList);
- // }
- registerService.saveBatch(list);
- LOGGER.info("存储数据库成功!");
- }
- }
- /**
- * easy excel上传
- * @param file
- * @return
- * @throws Exception
- */
- @PostMapping("/importEasyExcel")
- public R importEasyExcel(MultipartFile file) throws Exception {
- // 测试获取数据
- // String fileName = "C:\\Users\\HP\\Desktop\\ey导出.xlsx";
- // List
list = EasyExcel.read(fileName).head(Register.class).sheet().doReadSync(); - // for (Register data : list) {
- // System.out.println("读取到数据:{}" + JSON.toJSONString(data));
- // }
- EasyExcel.read(file.getInputStream(), Register.class, new UploadDataListener(registerService, userService, dictService)).sheet().doRead();
- return R.ok();
- }
使用异步Ajax方法
-
-
- class="upload-demo"
- action="#"
- :on-change="handleChange"
- :on-exceed="handleExceed"
- :file-list="fileList"
- :limit="1"
- multiple
- :auto-upload="true"
- >
-
- size="small"
- round
- type="primary"
- >点击上传
-
-
methods方法
- // 导入excel
- // 文件超出个数提示
- handleExceed (files, fileList) {
- this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)
- },
- handleChange (file) {
- let formData = new FormData()
- formData.append('file', file.raw) // 传文件
- this.$http({
- url: this.$http.adornUrl('/register/importEasyExcel'),
- method: 'post',
- data: formData,
- headers: {
- 'Content-Type': 'multipart/form-data'
- }
- }).then(({ data }) => {
- if (data && data.code === 0) {
- this.$message({
- message: '操作成功',
- type: 'success',
- duration: 1500
- })
- this.getDataList()
- this.$refs.upload.clearFiles() // 清除文件
- } else {
- this.$message.error(data.msg)
- }
- })
- },
-
相关阅读:
做什么数据表格啊,要做就做数据可视化
电脑重装系统后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