使用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;
}
}
}



使用EasyExcel对excel数据进行相似度判断的更多相关文章
- 使用 EasyExcel 写Excel数据(表头动态)
引入 jar 包 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel&l ...
- 将Excel数据导入mysql数据库的几种方法
将Excel数据导入mysql数据库的几种方法 “我的面试感悟”有奖征文大赛结果揭晓! 前几天需要将Excel表格中的数据导入到mysql数据库中,在网上查了半天,研究了半天,总结出以下几种方法,下面 ...
- easyExcel导出excel的简单使用
easyExcel导出excel的简单使用 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定 ...
- Python利用pandas处理Excel数据的应用
Python利用pandas处理Excel数据的应用 最近迷上了高效处理数据的pandas,其实这个是用来做数据分析的,如果你是做大数据分析和测试的,那么这个是非常的有用的!!但是其实我们平时在做 ...
- springboot批量导入excel数据
1 背景 小白今天闲着没事,在公司摸鱼,以为今天有事无聊的一天,突然上头说小子,今天实现一下批量导入Excel数据吧,当时我的内心是拒绝的,然后默默打开idea. 2 介绍 2.1 框架 java本身 ...
- SpringBoot整合easyexcel实现Excel的导入与导出
导出 在一般不管大的或者小的系统中,各家的产品都一样,闲的无聊的时候都喜欢让我们这些程序员导出一些数据出来供他观赏,非说这是必须需求,非做不可,那么我们就只能苦逼的哼哧哼哧的写bug喽. 之前使用PO ...
- JAVA使用easyexcel操作Excel
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本 ...
- SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多
关于封面:晚饭后回自习室的路上 Easyexcel 官方文档 Easyexcel | github 前言 最近也是在写的一个小练习中,需要用到这个.趁着这次就将写个整合的Demo给大家. 希望能够让大 ...
- 基于EasyExcel的大数据量导入并去重
源码:https://gitee.com/antia11/excel-data-import-demo 背景:客户需要每周会将上传一个 Excel 数据文件,数据量单次为 20W 以上,作为其他模块和 ...
- java的poi技术读取Excel数据到MySQL
这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 ...
随机推荐
- 官方文档 | 【JVM调优体系】「GC底层调优实战」XPocket为终结性能问题而生—开发指南
XPocket 用户文档 XPocket 是PerfMa为终结性能问题而生的开源的插件容器,它是性能领域的乐高,将定位或者解决各种性能问题的常见的Linux命令,JDK工具,知名性能工具等适配成各种X ...
- [CTF学习笔记]net-pack(WinShark)
题目:shark on wire 1 Description We found this packet capture. Recover the flag. 思路 这里懂得了winshark的一些基本 ...
- kubernetes(k8s)中部署dashboard可视化面板
Web 界面 (Dashboard) Dashboard 是基于网页的 Kubernetes 用户界面.你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用 ...
- python入门教程之十四面向对象
面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...
- LeeCode 二叉树问题(二)
二叉树的构建 LeeCode 106: 从中序遍历与后续遍历序列构造二叉树 题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, posto ...
- mysql迁移:docker迁入迁出mysql
docker迁出mysql数据库 测试环境: docker服务器 mysql服务器 IP 192.168.163.19 192.168.163.16 操作系统 CentOS7.8 CentOS7.8 ...
- 开心档之MySQL 复制表
MySQL 复制表 如果我们需要完全的复制MySQL的数据表,包括表的结构,索引,默认值等. 如果仅仅使用CREATE TABLE ... SELECT命令,是无法实现的. 本章节将为大家介绍如何完整 ...
- ES6中新增的promise异步编程解决方案
promise异步编程解决方案 第1章 准备 1.1 区别实例对象与函数对象 (1).实例对象:通过 new 函数 产生的对象,称为实例对象,简称对象 (2).函数对象:将函数作为对象使用 ...
- 五天学会Deep Learning
五天学完deep learning......是时候来证明chatGPT和new bing的能力了...... DAY1 Sigmoid function Sigmoid 函数是一种常用的激活函数,它 ...
- js对象方法大全
JavaScript中Object构造函数的方法 Object构造函数的方法节 Object.assign() 通过复制一个或多个对象来创建一个新的对象. Object.create() 使用指定的原 ...