首页 > 其他分享 >Easy Excel

Easy Excel

时间:2023-06-15 16:11:20浏览次数:44  
标签:index String Excel private public Easy EntityImportVo errMsg

EasyExcel导入文件

正常的数据直接导入,非正常数据错误原因返回给前端

EasyExcel官网

https://easyexcel.opensource.alibaba.com/docs/current/

代码

依赖

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

controller

@PostMapping("/import")
public AjaxResult importData(MultipartFile file) throws Exception {
    List list = entityService.importData(file);
    return AjaxResult.success(list);
}

service

@Override
public List importData(MultipartFile file) throws IOException {
    EntityImportListener EntityImportListener = new EntityImportListener();
    EasyExcel.read(file.getInputStream(), EntityImportVo.class,EntityImportListener).sheet().doRead();
    return EntityImportListener.getErrorList();
}

listener

@Slf4j
public class EntityImportListener extends AnalysisEventListener<EntityImportVo> implements ExcelListener<EntityImportVo> {
	// spring管理的容器需要在类初始化时注入,不能直接使用注解导入
    private EntityMapper EntityMapper;
    /**
     * 保存实体对象list
     */
    private Set<Entity> set = new HashSet<>();

    /**
     * 保存失败数据集合信息,返回给前端
     */
    private List<String> errorList = new ArrayList<>();

    /**
     * 每100条保存一次
     */
    private static final Integer BATCH_COUNT = 100;

    /**
     * excel 表头数据
     */
    private Map<Integer, String> headMap;

    /**
     * 判断是否有校验问题
     */
    private Boolean flag = false;
    
    public P2pOssProdImportListener(){
        //通过spring工具类管理bean
        this.EntityMapper = SpringUtil.getBean(EntityMapper.class);
    }
    @Override
    public ExcelResult<EntityImportVo> getExcelResult() {
        return null;
    }
    //解析数据的方法
     @Override
    public void invoke(EntityImportVo EntityImportVo, AnalysisContext analysisContext) {
        //校验对象必填字段是否为空
        try {
            validate(EntityImportVo,analysisContext);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        //没错误保存数据
        if(!flag){
            set.add(EntityImportVo);
            if(set.size() == BATCH_COUNT){
                saveData();
                set.clear();
            }
        }
    }
    private void validate(EntityImportVo EntityImportVo, AnalysisContext analysisContext) throws IllegalAccessException{
        Field[] fields = EntityImportVo.getClass().getDeclaredFields();
        Integer rowIndex = analysisContext.readRowHolder().getRowIndex();
        for(Field field : fields){
            field.setAccessible(true);
            boolean present = field.isAnnotationPresent(NotBlank.class);
            if(present){
                Object o = field.get(EntityImportVo);
                //字段值为空,添加信息到list
                if(ObjectUtils.isEmpty(o)){
                    //读取字段列
                    ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                    int index = annotation.index();
                    String msg = "第"+(rowIndex+1)+"行第"+(index+1)+"列数据不为空";
                    flag = true;
                    errorList.add(msg);
                }
            }
        }
        
        //非必填,判断转换
        if(StringUtils.isNotEmpty(EntityImportVo.getModeway())){
            String value1 = ModewayEnum.getValue(EntityImportVo.getModeway());
            if(StringUtils.isEmpty(value1)){
                String msg = "第"+(rowIndex+1)+"行接入方式不正确";
                flag = true;
                errorList.add(msg);
            }
        }
    }
    
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("全部解析完成");
        //最后一批数据入库
        saveData();
    }
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        this.headMap = headMap;
        log.info("解析到一条表头数据: {}", JSONUtil.toJsonStr(headMap));
    }

    private void saveData() {
        if(CollectionUtils.isNotEmpty(set)){
            entityMapper.insertByList(new ArrayList<>(set));
        }
    }
    
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        String errMsg = null;
        if (exception instanceof ExcelDataConvertException) {
            // 如果是某一个单元格的转换异常 能获取到具体行号
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception;
            Integer rowIndex = excelDataConvertException.getRowIndex();
            Integer columnIndex = excelDataConvertException.getColumnIndex();
            errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常<br/>",
                    rowIndex + 1, columnIndex + 1, headMap.get(columnIndex));
            if (log.isDebugEnabled()) {
                log.error(errMsg);
            }
        }
        if (exception instanceof ConstraintViolationException) {
            ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception;
            Set<ConstraintViolation<?>> constraintViolations = constraintViolationException.getConstraintViolations();
            String constraintViolationsMsg = constraintViolations.stream()
                    .map(ConstraintViolation::getMessage)
                    .collect(Collectors.joining(", "));
            errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg);
            if (log.isDebugEnabled()) {
                log.error(errMsg);
            }
        }
        if(StringUtils.isNotEmpty(errMsg)){
            errorList.add(errMsg);
        }
    }

    public  List getErrorList(){
        return errorList;
    }
}

实体

@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
public class EntityImportVo {
    /**
     * value和index建议使用一种
     */
    @ExcelProperty(index = 0)
    @NotBlank
    private String customerName;

    @ExcelProperty(index = 1)
    private String projectName;

    @ExcelProperty(index = 2)
    @NotBlank
    private String accessNumber;
}

标签:index,String,Excel,private,public,Easy,EntityImportVo,errMsg
From: https://www.cnblogs.com/wangpc/p/17483193.html

相关文章

  • 利用JXL(JExcelApi) 操作Excel文档
    http://coderdream.javaeye.com/blog/2506281、工具类:Java代码1.packagecom.coderdream.jxl;2.3.importjava.io.File;4.importjava.io.IOException;5.6.importjxl.Cell;7.importjxl.Sheet;8.import......
  • 22个常用Excel函数大全,直接套用,提升工作效率!
    Excel曾经一度出现了严重Bug,主要有两种比较悲催的情况,首先是这种: 更加悲催的是这种:  言归正传,今天和大家分享一组常用函数公式的使用方法:职场人士必须掌握的12个Excel函数,用心掌握这些函数,工作效率就会有质的提升。建议收藏备用着,有时间多学习操练下。目录:数字处理、判断公式、......
  • Excel将一列数据转化为N*M的矩阵
    1、例如转化为5*6的矩阵,在B1~G1处输入如下代码,则得到第一行数据:=INDEX(A:A,(ROW()-1)*6+COLUMN()-1)2、选中B1~G1,将数据往下拉,则得到对应矩阵:3、若第一列数据过长,也可以先计算共可以分成多少行:=CEILING(MATCH("zzzzz",A:A)/6,1) ......
  • Excel Undo-Redo的编程问题
    ExcelUndo历史栈对外是不透明的。代码对Excel表单的编辑操作会清空Excel内部的Undo历史。Application.OnUndo只支持一次撤销,并且不支持ReDo。使用DDE的方式支持Undo/Redo是现在发现的最佳方案。DDE的问题:异步的,因此和用户在界面上的操作容易产生混乱。需要同步化,但是编程比......
  • poi 读取 excel 总行数 ,总列数 注意事项 lastRowNum 、lastCellNum,起始 行号 lastRowN
    poi读取excel总行数,总列数注意事项lastRowNum、lastCellNumhttps://blog.csdn.net/HaHa_Sir/article/details/127235280        poi读取excel总行数,总列数注意事项lastRowNum、lastCellNum一、概述        1、如下图,有一个4行3列的excel表......
  • 虹科干货 | BI软件如何实时连接本地Excel?—以HK-Domo商业智能工具为例
    由于资源和人才的限制,很多中小微企业目前在数据收集和数据应用上还处于比较落后的阶段,没有合适的方法处理数据。最典型的情况就是通过Excel收集数据,然后频繁的手动生成报告。这样会导致数据质量差,流程重复,还可能增加数据错误的风险。因此,企业需要非常通过BI工具来改善数据处理流程,......
  • EasyCVR删除没有“国标设备编号”的黑名单,提示内容undefined该如何解决?
    EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。有用户反馈,在EasyCVR平台中,当删除没有“国标设备编号”的黑名单,弹出的提示有异......
  • 操作教程:如何正确配置让EasyNVR级联至EasyNVS平台?
    EasyNVS是EasyNVR的云管理平台,可实现内网监控上云,视频汇聚等功能。近期经常有用户咨询EasyNVR如何级联至EasyNVS平台进行云端统计和管理,在今天的文章中,我们来详细介绍一下。1、配置EasyNVS1)运行EasyNVS之前,可以先在easynvs.ini文件中将IP、端口、HTTPS证书及端口、设备接入密码等信......
  • EasyCVR删除没有“国标设备编号”的黑名单,提示内容undefined该如何解决?
    EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。有用户反馈,在EasyCVR平台中,当删除没有“国标设备编号”的黑名单,弹出的提示有......
  • easyui-datagrid 显示和隐藏
    easyui-datagrid显示和隐藏有点特殊正常使用的  style="display:none;"不起作用需要在外面套一个  easyui-panel  ,控制easyui-panel来间接控制  easyui-datagrid <divid='div_toexcel'class='easyui-panel'closed='true'><tableid=......