EasyExcel实现导入+各种数据校验

这篇具有很好参考价值的文章主要介绍了EasyExcel实现导入+各种数据校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现的功能

1.导入非xls和xlsx格式的文件

2.导入空数据的excel文件

3.数据缺失

4.导入的excel文件中有重复的数据

5.导入的excel文件数据错误

6.导入的模板不是正确模板

前置条件: 1)传的参数是 MultipartFile file
2)编写一个接收excel文件的实体类,保证@ExcelProperty(“表头1”)中的属性和excel导入的一致

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class ConfigVO {
   
    @ExcelProperty("表头1")
    private String head1;
    
    @ExcelProperty("表头2")
    private String head2;
}

easyexcel导入数据校验,java,excel,开发语言

3)在Impl中使用EasyExcel读数据,就会执行监听器

EasyExcel.read(multipartFile.getInputStream(), ConfigVO.class, new ConfigListener(this)).sheet().doRead();

4)自定义监听器

@Slf4j
public class ConfigListener extends AnalysisEventListener<ConfigVO> {
    private static int count = 0;
    List<ConfigVO> list = new ArrayList<>();
    // 此map用来存储模板错误的提示,由于我的全局异常捕获没有处理在监听器内抛出的异常信息,
    //所以就将数据挪到service层处理抛异常
    Map<String, String> errMap = new HashMap<>();

    @Autowired
    private IConfigService configcService;

    public ConfigListener(ConfigService configService) {
        this.configService = configService;
    }

    @Override
    public void invoke(ConfigVO configVO, AnalysisContext analysisContext) {
        count++;
        list.add(configVO);
    }


    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("成功读取" + count + "条数据");
        //保存读取到的数据到serviceImpl处理
        configService.saveConfig(list, errMap);
    }

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
       // 验证表头
    String head1 = "表头1";
    String head2 = "表头2";
    if (headMap.size() <= 0) {
        errMap.put("msg", "导入的模板不符合,请检查后重新导入!");
    }
    //value值才是表头信息
    if (!headMap.containsValue(head1) || !headMap.containsValue(head2)) {
        errMap.put("msg", "导入的模板不符合,请检查后重新导入!");
    }  
}
}

5)serviceImpl层处理单个数据校验+存储

public void saveConfig(List<ConfigVO> list, Map<String, String> errMap) {
    //批量存储数据的list
    List<ConfigVO> customerlist = new ArrayList<>();
    //提示错误的list
    List<Integer> errList = new ArrayList<>();
    //用来去重的map
    Map<String, Integer> map = new HashMap<>();
    //遍历list进行校验
    for (int i = 0; i < list.size(); i++) {
        //原因是因为我想获取出错的当前行,但是excel表格是从1开始,一条数据就是2
        Integer count = 2;
        count = count + i;
        ConfigVO configVO = list.get(i);
        //判有无空数据
        if (!ObjectUtils.isEmpty(configVO.getHead1()) && !ObjectUtils.isEmpty(configVO.getHead2())) {
            //判类型是否错误
            if (("1").equals(configVO.getHead1()) || ("2").equals(configVO.getHead1())) {
                String customerName = configVO.getHead2();
                //去前后空格
                customerName = StrUtil.trim(customerName);
                //校验单个数据是否超出字数限制
                if (customerName.length() > 255) {
                    errList.add(count);
                }
                //map去重的key
                String mapStr = configVO.getHead2() + ":" + configVO.getHead1();
                //去除excel中重复数据
                if (map.containsKey(mapStr)) {
                    //如果已经有了,那说明有重复数据,更新行数为最新的
                    map.put(mapStr, count);
                    //放到错误提示的list,遍历展示错误
                    errList.add(map.get(mapStr));
                } else {
                    //没有重复也放到map中便于去重
                    map.put(mapStr, count);
                    //放到需要存储的list
                    customerlist.add(configVO);
                }
            } else {
                errList.add(count);
            }
        } else {
            errList.add(count);
        }
    }
    //判断是否是错误模板
    if (!errMap.isEmpty()) {
        throw new CommonException(errMap.get("msg"));
    }
    //是否有导入错误的数据
    if (!errList.isEmpty()) {
        StringBuilder str = new StringBuilder();
        str.append("第");
        for (Integer err : errList) {
            str.append("" + err + "行,");
        }
        str.append("导入失败,请确认信息是否有误或数据是否有重复");
        throw new CommonException(str.toString());
    } else {
        //需要存到数据库的数据
        //查数据库查是否已经存在
        //存在就跳过,不存在就添加到list
        }
        //新增数据到数据库
        }
    }
}

1.导入非xls和xlsx格式的文件

//获取文件名+后缀
String filename = file.getOriginalFilename();
if (filename != null) {
    //获取其后缀
    String extension = filename.substring(filename.lastIndexOf(".") + 1);
    if (!(extension.equals("xls") || extension.equals("xlsx"))) {
        //此处为自定义异常捕获,可使用其他方式
        throw new CommonException("文件格式有误,请检查上传文件格式!!");
    }
}

2.导入空数据的excel文件

//校验导入的是空模板
try {
    InputStream inputStream = file.getInputStream();
    ExcelReader reader = ExcelUtil.getReader(inputStream, 0);
    int rowCount = reader.getRowCount();
    if (rowCount <= 1) {
        throw new CommonException("导入的为空模板,请检查后重新导入!!");
    }
}catch (IOException e) {
    log.error("文件获取失败:{}", e);
    throw new CommonException(e.getMessage());
}

3.导入的模板不是正确模板

判断导入的excel是否是提供的表
使用EasyExcel实现
1)首先要自定义监听器,继承AnalysisEventListener<转换excel的对象>
2)实现他的三个方法
invoke 逐行解析excel,每一行都会执行
doAfterAllAnalysed 解析完全部的excel,会调用该方法
invokeHeadMap 验证表头的方法
3)在invokeHeadMap方法中编写

@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    // 验证表头
    String head1 = "表头1";
    String head2 = "表头2";
    if (headMap.size() <= 0) {
        errMap.put("msg", "导入的模板不符合,请检查后重新导入!");
    }
    //value值才是表头信息
    if (!headMap.containsValue(head1) || !headMap.containsValue(head2)) {
        errMap.put("msg", "导入的模板不符合,请检查后重新导入!");
    }
}

headMap中存放的就是导入的excel全部的表头信息,
只要判断hashMap中是否包含我们的表头就可以校验是否是我们提供的模板文章来源地址https://www.toymoban.com/news/detail-785281.html

到了这里,关于EasyExcel实现导入+各种数据校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  【一】springboot整合swagger(超详细 【二】springboot整合swagger(自定义)(超详细) 【三】springboot整合token(超详细) 【四】springboot整合mybatis-plus(超详细)(上) 【五】springboot整合mybatis-plus(超详细)(下) 【六】springboot整合自定义全局异常

    2023年04月08日
    浏览(68)
  • “easyExcel”导入的代码实现

    使用easyExcel在导入数据事有很好的使用性,方便操作。 前端解析的文件流调用这个方法; 需要首先创建监听方法类 创建utils,创建这个方法即可 通过“easyExcel”导出文件代码:  在此记录,方便下次使用时调用。

    2024年02月15日
    浏览(43)
  • EasyExcel复杂表头数据导入

    参考文章:EasyExcel动态复杂表头导出方法

    2024年02月06日
    浏览(42)
  • EasyExcel导入和导出数据

    1.cmtroller 调用service方法,完成导出 2.service 调用工具类的方法完成导出 传入response,标题控制类(标题名称,合并的列数),员工列表,文件名称,excel的标题名称,要导出的数据类 3.工具类中的方法 4.控制标题类 这个类控制数据之前的显示内容 效果 2022-10-28 乱码解决 因为文件

    2023年04月09日
    浏览(38)
  • 使用EasyExcel实现导入和导出

    简单实现导入和导出 POM FileUtil controller Service ServiceImpl ExceptionPersonListener ExceptionPersonImportExcel

    2024年02月13日
    浏览(36)
  • EasyExcel实现execl导入导出

    在实际开发中,处理 Excel 文件是一个常见的需求。EasyExcel 是一个基于 Java 的开源库,提供了简单易用的 API,可以方便地读取和写入 Excel 文件。本文将介绍如何使用 EasyExcel 实现 Excel 导入功能,以及一些相关的技巧和注意事项。 在开始之前,我们需要准备好 EasyExcel 的环境。

    2024年02月09日
    浏览(37)
  • easyExcel模板数据导入数据库

    最近项目中需要用到Excel表格的上传下载功能,于是选择了EasyExcel这款工具,总的来说非常的好用,下面就做一个简单的演示。 官方文档地址   EasyExcel · 语雀 Alibaba Easy Excel - 简单、省内存的Java解析Excel工具 | 首页 pom.xml 中需要添加的依赖 这里用到了  @ExcelProperty  注解,这

    2023年04月08日
    浏览(53)
  • Java多例Bean的应用场景-easyExcel导入

    有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。 无状态会话bean :bean一旦实例化就被加进会话池中,各个

    2023年04月12日
    浏览(30)
  • elment UI + EasyExcel 实现 导入

    前端组件 Java   javaBean 监听器: 判断上传表格是否符合要求 实现类 SQL  oracle数据库批量新增  

    2024年02月07日
    浏览(90)
  • 数据导入导出(POI以及easyExcel)

            将一些数据库信息导出为Excel表格         将Excel表格数据导入数据库         大量数据的导入导出操作 常⽤的解决⽅案为: Apache POI 与阿⾥巴巴 easyExcel Apache POI 是基于 Office Open XML 标准( OOXML )和 Microsoft 的 OLE 2 复合⽂档 格式( OLE2 )处理各种⽂件格式的

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包