//输入参数为文件输入流
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表格的修改内容的更多相关文章

  1. java导入excle表格,并且对表格进行相应的修改,并对表格数据进行整理,最后导出本地表格等一系列操作

    1.首先创建一个java项目 完成效果如下图所示 2.导入以下jar包 3.代码如下 其中行和列的操作是根据需求自动划分的 public class auto_date { private stati ...

  2. 根据excel表格中的内容更新Sql数据库

    关于[无法创建链接服务器 "(null)" 的 OLE DB 访问接口 SQL Server 2008读取EXCEL数据时,可能会报这个错误:无法创建链接服务器 "(nu ...

  3. ANT 的Table表格样式修改方法

    注:(大家在给页面添加参数或者方法的时候,记得写上注释,方便别人查看) 1.表格行选中样式添加:(可以去beijing,精子库质控统计查看例子) (咱们以前页面上的表格都是在hover时显示选中效果, ...

  4. React+后端实现导出Excle表格的功能

    最近在做一个基于React+antd前端框架的Excel导出功能,我主要在后端做了处理,根据以下步骤,可以很容易就实现导出Excel表格数据的功能. 在做这类导出文件的功能,其实,在后端进行处理,会更 ...

  5. javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

    jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...

  6. JavaScript动态改变表格单元格内容的方法

    本文实例讲述了JavaScript动态改变表格单元格内容的方法.分享给大家供大家参考.具体如下: JavaScript动态改变表格单元格的内容,下面的代码通过修改单元格的innerHTML来修改单元格 ...

  7. 采用DOM进行表格的修改操作

    2015-08-31 <html> <head> <title>采用DOM进行表格的修改操作</title> <script language=& ...

  8. git教程: 查看文件状态与修改内容

    转载:时光机穿梭 我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed ...

  9. html怎样让表格里面的内容居中

    html怎样让表格里面的内容居中 text-align:center; 在表格td中,有两个属性控制居中显示 align——表示左右居中——left,center,right valign——控制上下 ...

随机推荐

  1. 5.Mysql常用函数

    5.常用函数函数可以进行字符串的处理.数值计算和日期计算等,mysql可以用在SQL(DML)中以增加SQL的功能.5.1 数值函数1. abs(x) 返回x的绝对值select abs(5),abs ...

  2. poj 2528(线段树+离散化) 市长的海报

    http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...

  3. Python3字符编码

    编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节 ...

  4. 利用js代码:document.forms[0].approval.value='false',当点击 <input type="image"按钮向表单传递不同的参数。

    <form action="flow_myTaskList"> <input type="hidden" name="approva ...

  5. 使用hMailServer搭建邮件服务器

    本文没有什么高深的技术内容,只是使用hMailServer,介绍搭建邮件服务器的全过程,供参考. 一.安装邮件服务器组件 打开软件,点下一步 选择存储数据的数据库,这里有两种选择, 一种是使用嵌入型数 ...

  6. 数据库MySQL 之 索引原理与慢查询优化

    数据库MySQL 之 索引原理与慢查询优化 浏览目录 索引介绍方法类型 聚合索引辅助索引 测试索引 正确使用索引 组合索引 注意事项 查询计划 慢查询日志 大数据量分页优化 一.索引介绍方法类型 1. ...

  7. vue ui之 iview 事件拦截

    用过easyui的,应该清楚easyui组件有很多before事件拦截,有时候会特别重要. 最近在研究vue的ui组件iview虽然功能也不错,感觉还是没有像easyui那样强大,就比如before事 ...

  8. 解决ubuntu常见问题

    cd /usr/local/hadoop 1. bash: cd: ~:Permission denied 报错:bash: cd: /usr/local/hadoop:Permission deni ...

  9. Windows-universal-samples学习笔记系列四:Data

    Data Blobs Compression Content indexer Form validation (HTML) IndexedDB Logging Serializing and dese ...

  10. AJAX-php-json数组

    1.在php中有个数组,响应回前端 $array=["习大大","川普","金三胖"];2.JS对象数据格式 ex: 数组: var TOM ...