比较两个Excle表格的修改内容
//输入参数为文件输入流
public static Map<String, List<String>> excelColumn2maplist(InputStream is)
{
//存储某一列数据
Map<String, List<String>> maplist = new HashMap<>();
//存储表头字段
List<String> tableHeadfields = new ArrayList<>();
XSSFWorkbook workBook = null;
try
{
workBook = new XSSFWorkbook(is);
}
catch (IOException e)
{
logger.error("读取工作簿出错" + e.getMessage());
} Sheet sheet = workBook.getSheetAt(0);
Row tableHeadRow = sheet.getRow(0); for (int i = 0; i < tableHeadRow.getLastCellNum(); i++)
{
tableHeadfields.add(getValue(tableHeadRow, i));
}
//所有表头字段所在列的索引
int severNameIndex = tableHeadfields.indexOf("severName");
int fileNameIndex = tableHeadfields.indexOf("fileName");
int keyIndex = tableHeadfields.indexOf("key");
int valueIndex = tableHeadfields.indexOf("value");
int versionIndex = tableHeadfields.indexOf("version");
int sysEnvRelatedIndex = tableHeadfields.indexOf("sysEnvRelated");
int markIndex = tableHeadfields.indexOf("mark");
int typeIndex = tableHeadfields.indexOf("type");
int validate_resultIndex = tableHeadfields.indexOf("validate_result");
// int tableHeadfieldsSize = tableHeadfields.size(); //将数据列放进map,规则是同一行,后一个字段包括前一个字段作为前缀,以分割符Constants.FieldSeparator(<SpS>) 进行分隔
List<String> severNameList = new ArrayList<>();
List<String> fileNameList = new ArrayList<>();
List<String> keyList = new ArrayList<>();
List<String> valueList = new ArrayList<>();
List<String> versionList = new ArrayList<>();
List<String> sysEnvRelatedList = new ArrayList<>();
List<String> markList = new ArrayList<>();
List<String> typeList = new ArrayList<>();
List<String> validate_resultList = new ArrayList<>(); StringBuilder sb = new StringBuilder();
for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++)
{
Row row = sheet.getRow(rowNum);
if (row == null)
{
continue;
}
sb.append(getValue(row, severNameIndex)).append(Constants.FieldSeparator);
severNameList.add(sb.toString());
sb.append(getValue(row, fileNameIndex)).append(Constants.FieldSeparator);
fileNameList.add(sb.toString());
sb.append(getValue(row, keyIndex)).append(Constants.FieldSeparator);
keyList.add(sb.toString());
sb.append(getValue(row, valueIndex)).append(Constants.FieldSeparator);
valueList.add(sb.toString());
sb.append(getValue(row, versionIndex)).append(Constants.FieldSeparator);
versionList.add(sb.toString());
sb.append(getValue(row, sysEnvRelatedIndex)).append(Constants.FieldSeparator);
sysEnvRelatedList.add(sb.toString());
sb.append(getValue(row, markIndex)).append(Constants.FieldSeparator);
markList.add(sb.toString());
sb.append(getValue(row, typeIndex)).append(Constants.FieldSeparator);
typeList.add(sb.toString());
sb.append(getValue(row, validate_resultIndex)).append(Constants.FieldSeparator);
validate_resultList.add(sb.toString());
sb.delete(0, sb.length()); }
maplist.put("severName", severNameList);
maplist.put("fileName", fileNameList);
maplist.put("key", keyList);
maplist.put("value", valueList);
maplist.put("version", versionList);
maplist.put("sysEnvRelated", sysEnvRelatedList);
maplist.put("mark", markList);
maplist.put("type", typeList);
maplist.put("validate_result", validate_resultList); return maplist;
} private static String getValue(Row row, int cellNum)
{
if (row.getCell(cellNum) == null)
{
return "";
}
if (row.getCell(cellNum).getCellType() == row.getCell(cellNum).CELL_TYPE_BOOLEAN)
{
return String.valueOf(row.getCell(cellNum).getBooleanCellValue()).trim();
}
else if (row.getCell(cellNum).getCellType() == row.getCell(cellNum).CELL_TYPE_NUMERIC)
{
return String.valueOf(row.getCell(cellNum).getNumericCellValue()).trim();
}
else
{
return String.valueOf(row.getCell(cellNum).getStringCellValue()).trim();
}
} public static void compare2MapList(Map<String, List<String>> refMaplist, Map<String, List<String>> compareMaplist,
List<String> newAddlist, List<String> removelist, List<ArrayList<String>> updatelist)
{
/* Map<String, List<String>> difflist = new HashMap<>();
List<String> newAddlist = new ArrayList<>();
List<String> removelist = new ArrayList<>();
List<ArrayList<String>> updatelist =new ArrayList<ArrayList<String>>();
difflist.put("newAdd", newAddlist);
difflist.put("remove", removelist);*/ for (Map.Entry<String, List<String>> entry : refMaplist.entrySet())
{
//得到字段名
String reffieldName = entry.getKey();
//得到字段名对应的参考源列表
List<String> reffieldList = entry.getValue();
//得到字段名对应的比较源列表
List<String> comparefieldList = compareMaplist.get(reffieldName); //1.相对于参考源新添加的字段
for (int i = 0; i < comparefieldList.size(); i++)
{
Boolean IsExist = reffieldList.contains(comparefieldList.get(i));
if (IsExist == false)
{
newAddlist.add(comparefieldList.get(i));
}
} //2.相对于参考源移除的变量
for (int i = 0; i < reffieldList.size(); i++)
{
Boolean IsExist = comparefieldList.contains(reffieldList.get(i));
if (IsExist == false)
{
removelist.add(reffieldList.get(i));
}
} //3.参考源,比较源中更改过的 //参考源中存在,比较源中不存在
List<String> AdiffBlist = getDiffABList(reffieldList, comparefieldList);
//比较源中存在,参考源中不存在
List<String> BdiffAlist = getDiffBAList(reffieldList, comparefieldList); for (int i = 0; i < BdiffAlist.size(); i++)
{
String originBStr = getBeforeLastSeparatorStr(BdiffAlist.get(i));
for (int j = 0; j < AdiffBlist.size(); j++)
{
String originAStr = getBeforeLastSeparatorStr(AdiffBlist.get(j));
if (originBStr.equals(originAStr))
{
ArrayList<String> updateFieldlist = new ArrayList<String>();
//第一个为更改后的
updateFieldlist.add(BdiffAlist.get(i));
//第一个为参考源的
updateFieldlist.add(AdiffBlist.get(j));
updatelist.add(updateFieldlist);
}
} } } } public static String getBeforeLastSeparatorStr(String str)
{
String[] strings = str.split(Constants.FieldSeparator);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < strings.length - 2; i++)
{
sb.append(strings[i]);
}
return sb.toString();
} public static List<String> getDiffABList(List<String> listA, List<String> listB)
{
List<String> retainAllResult = new ArrayList<String>();
retainAllResult.addAll(listA);
retainAllResult.retainAll(listB);
List<String> diffABResult = new ArrayList<String>();
diffABResult.addAll(listA);
diffABResult.removeAll(retainAllResult);
return diffABResult;
} public static List<String> getDiffBAList(List<String> listA, List<String> listB)
{
List<String> retainAllResult = new ArrayList<String>();
retainAllResult.addAll(listB);
retainAllResult.retainAll(listA);
List<String> diffABResult = new ArrayList<String>();
diffABResult.addAll(listB);
diffABResult.removeAll(retainAllResult);
return diffABResult;
} public static List<String> getRetainABList(List<String> listA, List<String> listB)
{
List<String> retainAllResult = new ArrayList<String>();
retainAllResult.addAll(listA);
retainAllResult.retainAll(listB); return retainAllResult;
}
public static void main(String[] args)
throws Exception
{
File file = new File("D:\\TestFile\\input.xlsx");
File file1 = new File("D:\\TestFile\\input1.xlsx");
InputStream inputStream = null;
InputStream inputStream1 = null;
try
{
inputStream = new FileInputStream(file);
inputStream1 = new FileInputStream(file1);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
Map<String, List<String>> refMaplist = excelColumn2maplist(inputStream);
Map<String, List<String>> compareMaplist = excelColumn2maplist(inputStream1);
List<String> newAddlist = new ArrayList<>();
List<String> removelist = new ArrayList<>();
List<ArrayList<String>> updatelist = new ArrayList<>();
compare2MapList(refMaplist, compareMaplist, newAddlist, removelist, updatelist);
System.out.println(newAddlist);
System.out.println("*************************************");
System.out.println(removelist);
System.out.println("*************************************");
for (int i = 0; i < updatelist.size() - 1; i++)
{
System.out.println(updatelist.get(i));
}
String str1 =
"aggregation-mmpsourceservice<SpS>source_config.properties<SpS>youku.mobile.import.subtypes<SpS>大<SpS>";
String str2 =
"aggregation-mmpsourceservice<SpS>source_config.properties<SpS>youku.mobile.import.subtypes<SpS>大<SpS>";
String str11 = getBeforeLastSeparatorStr(str1);
String str22 = getBeforeLastSeparatorStr(str2);
System.out.println("---------------------------------");
System.out.println(str11);
System.out.println("---------------------------------");
System.out.println(str22);
}
比较两个Excle表格的修改内容的更多相关文章
- java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列操作
1.首先创建一个java项目 完成效果如下图所示 2.导入以下jar包 3.代码如下 其中行和列的操作是根据需求自动划分的 public class auto_date { private stati ...
- 根据excel表格中的内容更新Sql数据库
关于[无法创建链接服务器 "(null)" 的 OLE DB 访问接口 SQL Server 2008读取EXCEL数据时,可能会报这个错误:无法创建链接服务器 "(nu ...
- ANT 的Table表格样式修改方法
注:(大家在给页面添加参数或者方法的时候,记得写上注释,方便别人查看) 1.表格行选中样式添加:(可以去beijing,精子库质控统计查看例子) (咱们以前页面上的表格都是在hover时显示选中效果, ...
- React+后端实现导出Excle表格的功能
最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,根据以下步骤,可以很容易就实现导出Excel表格数据的功能. 在做这类导出文件的功能,其实,在后端进行处理,会更 ...
- javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行
jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...
- JavaScript动态改变表格单元格内容的方法
本文实例讲述了JavaScript动态改变表格单元格内容的方法.分享给大家供大家参考.具体如下: JavaScript动态改变表格单元格的内容,下面的代码通过修改单元格的innerHTML来修改单元格 ...
- 采用DOM进行表格的修改操作
2015-08-31 <html> <head> <title>采用DOM进行表格的修改操作</title> <script language=& ...
- git教程: 查看文件状态与修改内容
转载:时光机穿梭 我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed ...
- html怎样让表格里面的内容居中
html怎样让表格里面的内容居中 text-align:center; 在表格td中,有两个属性控制居中显示 align——表示左右居中——left,center,right valign——控制上下 ...
随机推荐
- 10.Mysql索引
10.索引的设计和使用10.1 索引概述BTREE索引:Mysql(MyIASM和Innodb)默认的索引类型.前缀索引:对索引字段的前N个字符创建索引.N的最大取值和存储引擎有关,MyIASM支持最 ...
- C++中的npos,size_t,size_type
string类提供了6种查找函数,每种函数以不同形式find命名,这些操作全都返回string::size_type类型的值,以下标形式标记查找匹配所发生的位置,或返回一个名为string::npos ...
- iOS.PrototypeTools
1. iPhone/iPad 原型工具 http://giveabrief.com/ 2. proto.io https://proto.io/ 3. Origami http://facebook. ...
- 看懂 Fiddler 的瀑布图
最近准备给组内的新同学们分享下 Fiddler 这枚神器,可以讲的地方太多,我打算把一节课讲不完的内容写在博客上,大家可以随便看看.今天先介绍下 Fiddler 的瀑布图. 每个网络请求都会经历域名解 ...
- delphi 7 求无码
我们知道delphi很多源码,都是没有提供的,比如BDE,一旦有问题,我们也找不到办法解决,那么那些dcu对应的pas是没有公布的呢?笔者做了个统计. 下面是delphi7 的,如果你的程序有用到没有 ...
- m序列c语言实现
演示,不是算法 void m4() { int a[4]={1,0,0,1}; int m[15]; int temp; for(int i=0;i<15;i++){ m[i] = a[0]; ...
- mysql里几个超时配置参数wait_timeout,net_read_timeout等
以下这些配置项单位都是秒,在mysql命令行中可以使用show global variables like '变量名';可查询配置值. connect_timeout:连接响应超时时间.服务器端在这个 ...
- 2.7 Sobel导数
OpenCV函数 Sobel(src_gray,grad_x/grad_y,ddepth,x_order,y_order,scale,delta,BORDER_DEFAULT ) Scharr( ) ...
- poj-3177(并查集+双联通分量+Tarjan算法)
题目链接:传送门 思路: 题目要将使每一对草场之间都有至少两条相互分离的路径,所以转化为(一个有桥的连通图至少加几条边才能变为双联通图?) 先求出所有的桥的个数,同时将不同区块收缩成一个点(利用并查集 ...
- CodeCraft-19 and Codeforces Round #537 (Div. 2) D 多重排列 + 反向01背包 + 离线处理
https://codeforces.com/contest/1111/problem/D 多重排列 + 反向01背包 题意: 给你一个字符串(n<=1e5,n为偶数),有q个询问,每次询问两个 ...