使用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技术可以在 ...
随机推荐
- Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信)
Pause Giant AI Experiments: An Open Letter(暂停大型人工智能实验: 一封公开信) 前几天在 futureoflife 网站上有一封公开信,呼吁暂停大型人工智能 ...
- Wiki.js配置LDAP认证
安装好wikijs 之后, 可以进行进一步的详细配置. 这里介绍 LDAP 认证的配置. 在 管理 -> 身份验证 -> 添加策略 -> 选择 LDAP/AD , 如下: 接下来进行 ...
- CentOS 落幕,将于2021年底结束维护
官方最新消息: 译文: CentOS项目的未来是CentOS Stream,明年,我们将把重点从重建Red Hat Enterprise Linux(RHEL)的CentOS Linux转移到Cent ...
- pandas之缺失值处理
在一些数据分析业务中,数据缺失是我们经常遇见的问题,缺失值会导致数据质量的下降,从而影响模型预测的准确性,这对于机器学习和数据挖掘影响尤为严重.因此妥善的处理缺失值能够使模型预测更为准确和有效. 为什 ...
- 学习关于JavaScript常用的8大设计模式
JavaScript 常用的8大设计模式有 工厂模式:工厂模式是一种创建对象的模式,可以通过一个共同的接口创建不同类型的对象,隐藏了对象的创建过程. 单例模式:单例模式是一种只允许实例化一次的对象模式 ...
- Go 语言切片是如何扩容的?
原文链接: Go 语言切片是如何扩容的? 在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice). 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装.它非常灵活,支 ...
- JQuery点击复制文本框内容的方法插件
[导读] 文章介绍了两种常用的点击复制文本框内容方法,一种是but IE only,同样的这个也是我们经常使用的.优点是体积小,仅有十来行代码,但缺点也很明显,只支持IE及以IE为内核的浏览器,另一种 ...
- Vuex刷新页面数据会丢失吗?咋解决的?
1.问题描述:页面刷新的时候vuex里的数据会重新初始化,导致数据丢失.因为vuex里的数据是保存在运行内存中的,当页面刷新时,页面会重新加载vue实例,vuex里面的数据就会被重新赋值. 2.解决思 ...
- $el,$nextTick,$set
this.$el this.$el DOM的根元素 => 是一个完全唯一的 $el 直到组件挂载完成 (mounted) 之前都会是 undefined. 对于单一根元素的组件,$el 将会指向 ...
- C++ 基于Capstone实现反汇编器
Capstone是一个反汇编框架,提供了一个简单.轻量级的API接口,可透明地处理大多数流行的指令体系,包括x86/x86-64.ARM及MIPS等.Capstone支持C/C++和Python,并且 ...