Excel 导入

依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

service 读取excel文件的行数据

DataExcelListener<DeviceTemplateExcel> listener = new DataExcelListener<DeviceTemplateExcel>();
// headRowNumber(1):表示第一行为表头,从第二行取值
ExcelReader excelReader = EasyExcelFactory.read( file.getInputStream() , DeviceTemplateExcel.class, listener).headRowNumber(1).build();
excelReader.readAll();
List<DeviceTemplateExcel> data = listener.getDatas();
excelReader.finish();
    @Override
    @Transactional(rollbackFor = Exception.class)
    public RP importDevice(MultipartFile file, Long productId) throws IOException {

        DataExcelListener<DeviceTemplateExcel> listener = new DataExcelListener<DeviceTemplateExcel>();
        // headRowNumber(1):表示第一行为表头,从第二行取值
        ExcelReader excelReader = EasyExcelFactory.read( file.getInputStream() , DeviceTemplateExcel.class, listener).headRowNumber(1).build();
        excelReader.readAll();
        List<DeviceTemplateExcel> data = listener.getDatas();
        excelReader.finish();

        if (data.size() == 3) {
            return RP.failure("导入失败,请检查导入文件是否正确");
        }

        Product product = productService.getById(productId);
        if (product == null) {
            throw new ServiceException("产品不存在");
        }
        List<String> deviceSnList = data.stream().map(DeviceTemplateExcel::getDeviceSn).collect(Collectors.toList());
        List<Device> repeatList = baseMapper.selectList(Wrappers.<Device>update().lambda().in(Device::getDeviceSn, deviceSnList));
        List<Device> deviceList = new ArrayList<>();
        //导出失败原因
        List<DeviceFailureExportExcel> exportExcels = new ArrayList<>();
        for (DeviceTemplateExcel entity : data) {
            if (StringUtils.isBlank(entity.getDeviceName()) || StringUtils.isBlank(entity.getDeviceSn())) {
                DeviceFailureExportExcel reason = new DeviceFailureExportExcel();
                reason.setDeviceName(entity.getDeviceName());
                reason.setDeviceSn(entity.getDeviceSn());
                reason.setFailureReason(StringUtils.isBlank(entity.getDeviceName()) ? "设备名称不能为空!" : "设备序列号不能为空!");
                exportExcels.add(reason);
                continue;
            }
            //数据库中的判重
            Optional<Device> deviceOpt = repeatList.stream().filter(item -> item.getDeviceSn().equals(entity.getDeviceSn())).findFirst();
            //还未新增的设备判重
            Optional<Device> deviceAddOpt = deviceList.stream().filter(item -> item.getDeviceSn().equals(entity.getDeviceSn())).findFirst();
            if (deviceOpt.isPresent() || deviceAddOpt.isPresent()) {
                DeviceFailureExportExcel reason = new DeviceFailureExportExcel();
                reason.setDeviceName(entity.getDeviceName());
                reason.setDeviceSn(entity.getDeviceSn());
                reason.setFailureReason("设备序列号已存在!");
                exportExcels.add(reason);
                continue;
            }
            Device device = new Device();
            device.setDeviceName(entity.getDeviceName());
            device.setDeviceSn(entity.getDeviceSn());
            device.setProductId(productId);
            device.setTenantId(AuthUtil.getTenantId()); 
            deviceList.add(device);
        }
        if (deviceList.size() > 0) {
            this.saveBatch(deviceList);
        }
        if (exportExcels.size() > 0) {
            return RP.failure("请重新处理失败的数据!");
        } else {
            return RP.failure("操作成功");
        }
    }

监听类

package com.sinenux.iot.core.exect;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;

/**
 * 解析监听器
 */
public class DataExcelListener<T> extends AnalysisEventListener<T> {
    /**
     * 自定义用于暂时存储data
     * 可以通过实例获取该值
     */
    private List<T> datas = new ArrayList<>();

    /**
     * 每解析一行都会回调invoke()方法
     *
     * @param object  读取后的数据对象
     * @param context 内容
     */
    @Override
    @SuppressWarnings("unchecked")
    public void invoke(Object object, AnalysisContext context) {
        T data = (T) object;
        //数据存储到list,供批量处理,或后续自己业务逻辑处理。
        datas.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        //解析结束销毁不用的资源
        //注意不要调用datas.clear(),否则getDatas为null
    }

    /**
     * 返回数据
     *
     * @return 返回读取的数据集合
     **/
    public List<T> getDatas() {
        return datas;
    }

    /**
     * 设置读取的数据集合
     *
     * @param datas 设置读取的数据集合
     **/
    public void setDatas(List<T> datas) {
        this.datas = datas;
    }

}

实体类 DeviceTemplateExcel

  注意这里 lombok的@Data注解 和EasyExcel有冲突 不能使用  @Data 要用 get set 方法

package com.sinenux.iot.core.exect;

import com.alibaba.excel.annotation.ExcelProperty;

import java.io.Serializable;

/**
 * 设备导入模板
 * 注意这里 lombok的@Data注解 和EasyExcel有冲突 不能使用  @Data 要用 get set 方法
 *
 * @author xulk
 */

public class DeviceTemplateExcel implements Serializable {
	private static final long serialVersionUID = 1L;

	@ExcelProperty(value = "设备名称", index = 0)
	private String deviceName;

	@ExcelProperty(value = "设备序列号(不可重复)", index = 1)
	private String deviceSn;



	public String getDeviceName() {
		return deviceName;
	}

	public void setDeviceName(String deviceName) {
		this.deviceName = deviceName;
	}

	public String getDeviceSn() {
		return deviceSn;
	}

	public void setDeviceSn(String deviceSn) {
		this.deviceSn = deviceSn;
	}
}

相关推荐

  1. excel导入导出

    2024-06-05 20:02:07       19 阅读
  2. Excel 导入

    2024-06-05 20:02:07       8 阅读
  3. Excel 导入导出的封装

    2024-06-05 20:02:07       20 阅读
  4. php 导入excel

    2024-06-05 20:02:07       37 阅读
  5. 导入excel内容

    2024-06-05 20:02:07       15 阅读
  6. 关于txt导入Excel

    2024-06-05 20:02:07       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-05 20:02:07       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-05 20:02:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-05 20:02:07       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-05 20:02:07       20 阅读

热门阅读

  1. 深度解读ChatGPT基本原理

    2024-06-05 20:02:07       10 阅读
  2. react面试题

    2024-06-05 20:02:07       9 阅读
  3. linux定时删除历史日志

    2024-06-05 20:02:07       7 阅读
  4. day25-XML

    day25-XML

    2024-06-05 20:02:07      7 阅读
  5. 数据分析——Excel篇

    2024-06-05 20:02:07       8 阅读
  6. 详解 Spark 核心编程之 RDD 持久化

    2024-06-05 20:02:07       11 阅读
  7. 【HarmonyOS】应用通知广播的使用

    2024-06-05 20:02:07       12 阅读
  8. Vue基础(2)响应式基础

    2024-06-05 20:02:07       10 阅读
  9. AIGC如何改变人类生活20240529

    2024-06-05 20:02:07       10 阅读
  10. Oracle拉链表

    2024-06-05 20:02:07       8 阅读
  11. PostgreSQL 和Oracle锁机制对比

    2024-06-05 20:02:07       11 阅读
  12. Neo4J中构建的知识图谱,如何使用推理算法

    2024-06-05 20:02:07       11 阅读
  13. EasyExcel实现导入导出

    2024-06-05 20:02:07       10 阅读
  14. QT常用快捷键

    2024-06-05 20:02:07       9 阅读
  15. 华为欧拉 openEuler 23.09 一键安装 Oracle 12CR2 单机

    2024-06-05 20:02:07       7 阅读