美文网首页
POI 导入订单 excel 空行或空数据处理并获取真实数据

POI 导入订单 excel 空行或空数据处理并获取真实数据

作者: 一只浩子 | 来源:发表于2021-08-09 19:28 被阅读0次

    需求:使用excel订单模板录入客户订单的订单明细,web端导入excel后,将验证excel中必填的字段,报错信息需整合后全部同时显示在提示框中。例如:第几行商品名不存在,第几行客户不为空。

    分析合理性:

    1. 假如发现一个错误,马上反馈给用户,然后这张表中有10个错误,用户需要导入10次,才能成功,这样做用户体验不是那么友好。
    2. 但是如果将错误信息一并显示出来,那么客户将全部错误改正后就能一次导入成功。

    使用poi框架和POIUtils解析excel数据(本模板表字段全是String格式)

    问题:getLastRowNum 能否拿到真实的sheet中行数size吗?excel中可能会出现这些情况?

    1. row = sheet.getRow(i) row == null (空行)
    2. 旧的数据或数据格式,使用delete键删除后,row不会等于null,解析的结果是空字符串或其它(这是个坑)

    从而导致 size = getLastRowNum 最终可能会失真,如何过滤掉不要的数据行,获取到真实的行号并将错误信息行反馈给用户,是接下来需要做的。

    思路:将循环遍历取得sheet中全部数据存入list

    1. 如果row = null ,也会创建一个map,将对应的字段全部置为空字符串
    2. 如果row可能是上面2的情况,excel表中对应的内容会都是空字符串或其它,这时同样存入map中
    3. 正常数据也存入map中
    4. 遍历的同时,将行号row同时放入这个map(重要);

    然后需要根据需求删除不符合的行,假如一条真实数据需要(客户名,商品名,重量),那么需删除这3个条件为空的数据行,剩下真实有用的数据。

    private Map<String, Object> analysisExcelToList(MultipartFile multipartFile) throws Exception {
            Workbook workbook = WorkbookFactory.create(multipartFile.getInputStream());
            Sheet sheet = workbook.getSheetAt(0);
            // getLastRowNum 拿到的可能不是真实的表size大小,有可能单元格清除内容后保留的单元格也会记录size大小
            int size = sheet.getLastRowNum();
            List<Map<String, String>> list = new ArrayList<>(size);
            Row buyerRow = sheet.getRow(1);
            // 获取客户名和订单类型
            String buyerName = POIUtils.getStringCellValue(buyerRow.getCell(1));
            String orderType = POIUtils.getStringCellValue(buyerRow.getCell(3));
    
            for (int i = 3; i <= size; i++) {
                Map map = new HashMap<>();
                Row row = sheet.getRow(i);
                // 若执行到行为空,将填充空数据(delete 删除的空行会保留格式,row不会等于null)
                if (row == null) {
                    map.put("smallByrName", "");
                    map.put("pdtAlias", "");
                    map.put("weight", "");
                    map.put("remark", "");
                    continue;
                }
                map.put("smallByrName", POIUtils.getStringCellValue(row.getCell(1)));
                map.put("pdtAlias", POIUtils.getStringCellValue(row.getCell(2)));
                map.put("weight", POIUtils.getStringCellValue(row.getCell(3)));
                map.put("remark", POIUtils.getStringCellValue(row.getCell(4)));
                map.put("row", String.valueOf(i + 1));
                list.add(map);
            }
            // 删除空行(二级订单:smallByrName、pdtAlias、weight 三个参数同时为空)
            list.removeIf(e -> StringUtils.isBlank(e.get("smallByrName")) && StringUtils.isBlank(e.get("pdtAlias")) && StringUtils.isBlank(e.get("weight")));
            Map<String, Object> map = new HashMap<>();
            map.put("buyerName", buyerName);
            map.put("orderType", orderType);
            map.put("list", list);
            return map;
        }
    

    最后需要验证每一条数据的内容是否符合需求(可能某字段为空,可能某字段在数据库中没有),不符合需求的行,map中都有一个行号row,可以将错误信息加入到errorList中,最终经过处理,反馈提示用户。

    excel.png promt.png

    相关文章

      网友评论

          本文标题:POI 导入订单 excel 空行或空数据处理并获取真实数据

          本文链接:https://www.haomeiwen.com/subject/oyazvltx.html