使用EasyExcel对excel数据进行相似度判断


@Data
public class ExeclDto {
    /**
     * execl表
     */
    private String filename;
    /**
     * 需要匹配的工作表名
     */
    private String name1;
    /**
     * 需要匹配的工作表名
     */
    private String name2;
}

 

@SpringBootTest
@Slf4j
class CmmcysApplicationTests {

    @Test
    public void testReadExcel() throws IOException, InvalidFormatException {
        // 读取的excel文件路径
        String filename = "src/main/resources/static/xlsx/车型名称映射.xlsx";
        String filename_new = "src/main/resources/static/xlsx/结果表.xlsx";
        // 判断filename是否为空
        if (!StringUtils.isEmpty(filename)) {
            //读取excel
            ExeclDto execlDto = new ExeclDto();
            execlDto.setFilename(filename);
            execlDto.setName1("A");
            execlDto.setName2("B");
            Map<String, String> map = readExcel(execlDto);
            //如果map非空就写入
            if (!map.isEmpty()) {
                List list = new ArrayList<>();
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    CarDto carDto = new CarDto();
                    carDto.setName_a(entry.getKey());
                    carDto.setName_b(entry.getValue());
                    list.add(carDto);
                    log.info(entry.getKey() + " ;" + entry.getValue());
                }
                EasyExcel.write(filename_new, CarDto.class).sheet("结果表").doWrite(list);
            }else {
                System.out.println("文件没有该工作表,请重新检查上传");
            }
        } else {
            System.out.println("文件为空,请重新上传");
        }
    }


    public Map<String,String> readExcel(ExeclDto execlDto){
        // 读取的excel文件路径
        String filename = execlDto.getFilename();
        // 读取excel
        File file = new File(filename);
        Workbook sheets = null;
        try {
            sheets = WorkbookFactory.create(file);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }
        Sheet sheetAt1 = sheets.getSheet(execlDto.getName1());
        Sheet sheetAt2 = sheets.getSheet(execlDto.getName2());
        //判断excel表中是否有该工作表
        if (sheetAt1 !=null && sheetAt2 !=null) {
            //采用LinkedHashMap保证数据的顺序性
            Map<String, Double> map1 = new LinkedHashMap<>();
            Map<String, String> map2 = new LinkedHashMap<>();
            //循环工作表行
            for (Row row1 : sheetAt1) {
                //获取工作表列值
                String stringCellValue = row1.getCell(0).getStringCellValue();
                //设置string类型初始阈值
                map1.put("bz", 0.0);
                //循环需要比较的工作表列值
                for (Row row2 : sheetAt2) {
                    //获取工作表列值
                    String stringCellValue1 = row2.getCell(0).getStringCellValue();
                    //判断车辆款式,获取字符串位置
                    if (stringCellValue.contains("款") && stringCellValue1.contains("款")) {
                        int i = stringCellValue.indexOf("款");
                        int b = stringCellValue1.indexOf("款");
                        //进行款式截取并比较款式是否一致
                        if (stringCellValue.substring(i - 4, i).equals(stringCellValue1.substring(b - 4, b))) {
                            //采用String里面的方法进行相似度取值
                            double similarity = StringUtils.getJaroWinklerDistance(stringCellValue, stringCellValue1);
                            //进行相似度比较
                            if (similarity > map1.get("bz")) {
                                //相似度高的替换低的
                                map1.put("bz", similarity);
                                //存放进map集合
                                map2.put(stringCellValue, stringCellValue1);
                            }
                        }
                    }
                }
            }
            return map2;
        }else {
            return null;
        }
    }
}

 

 

posted on 2023-06-20 19:56  梦之泽畔  阅读(287)  评论(0编辑  收藏  举报