Java比较两份excel-Apache POI

1:下列代码为Java比较两份excel 或者同一份excel的两个不同的sheet每一行是否相同;同时提供模糊匹配和精准匹配两个方案可以选择。大家如果有更好的方法 欢迎大家在下面留言哦...

  A:读取excel组装成list集合

public class RWExcel {
	
	private String filePath;
	private String anotherfilePath;

	
	/**
	 * 构造方法
	 * */
	
	public RWExcel(String filePath,String anotherfilePath){
		
		this.filePath = filePath;
		this.anotherfilePath = anotherfilePath;
	}

	/**
	 * 
	 * 读取excel 封装成集合
	 * 该程序需要传入一份excel 和excel的列数 行数由程序自动检测
	 * 注意:该方法统计的行数是默认第一行为title 不纳入统计的
	 * 
	 * @return
	 * 
	 */
	// @Test
	public ArrayList<List> ReadExcel(int sheetNum) {

		// int column = 5;//column表示excel的列数

		ArrayList<List> list = new ArrayList<List>();

		try {
			// 建需要读取的excel文件写入stream
			HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
			// 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
			HSSFSheet sheet = workbook.getSheetAt(sheetNum);
			// 获取sheet1中的总行数
			int rowTotalCount = sheet.getLastRowNum();
			//获取总列数
			int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
			
			//System.out.println("行数为:"+rowTotalCount+"列数为:"+columnCount);

			for (int i = 0; i <= rowTotalCount; i++) {
				// 获取第i列的row对象
				HSSFRow row = sheet.getRow(i);
				
				ArrayList<String> listRow = new ArrayList<String>();

				for (int j = 0; j < columnCount; j++) {
					//下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
					String cell = null;
					//如果未null则加上""组装成非null的字符串
					if(row.getCell(j) == null){
						
						cell = row.getCell(j)+"";
						
						listRow.add(cell);
					//如果读取到额cell不为null 则直接加入	listRow集合
					}else{
						cell = row.getCell(j).toString();
						listRow.add(cell);
					}
					// 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
					//System.out.printf("%15s", cell);

				}

				list.add(listRow);

				//System.out.println();
			}

		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

		return list;
	}
	
	/**
	 * 读取另外一份Excel 保存成list集合
	 * */
	
	public ArrayList<List> ReadAnotherExcel(int anotherSheetNum){
		

		ArrayList<List> list = new ArrayList<List>();

		try {
			// 建需要读取的excel文件写入stream
			HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(anotherfilePath));
			// 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
			HSSFSheet sheet = workbook.getSheetAt(anotherSheetNum);
			// 获取sheet1中的总行数
			int rowTotalCount = sheet.getLastRowNum();
			//获取总列数
			int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
			
			//System.out.println("行数为:"+rowTotalCount+"列数为:"+columnCount);

			for (int i = 0; i <= rowTotalCount; i++) {
				// 获取第i列的row对象
				HSSFRow row = sheet.getRow(i);
				
				ArrayList<String> listRow = new ArrayList<String>();

				for (int j = 0; j < columnCount; j++) {
					//下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
					String cell = null;
					//如果未null则加上""组装成非null的字符串
					if(row.getCell(j) == null){
						
						cell = row.getCell(j)+"";
						
						listRow.add(cell);
					//如果读取到额cell不为null 则直接加入	listRow集合
					}else{
						cell = row.getCell(j).toString();
						listRow.add(cell);
					}
					// 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
					//System.out.printf("%15s", cell);

				}

				list.add(listRow);

				//System.out.println();
			}

		} catch (FileNotFoundException e) {

			e.printStackTrace();
		} catch (IOException e) {

			e.printStackTrace();
		}

		return list;
	}
	
	
	/**
	 * 调试方法
	 * */

//	public static void main(String[] args) {
//
//		 RWExcel excel = new RWExcel("D:\\345.xls", "D:\\345.xls");
//		 
//		 ArrayList<List> list1 = excel.ReadExcel(0);
//
//		 ArrayList<List> list2 = excel.ReadAnotherExcel(1);
//		 
//		 for (List list : list1) {
//			
//			 System.out.println(list.toString());
//		}
//		 
//		 System.out.println("==========================");
//		 
//		 for (List list : list2) {
//				
//			 System.out.println(list.toString());
//		}
//	}
}

   B:对比两个list集合是否想同 包含两个方法可选isPerfectMatch=true为精准匹配 isPerfectMatch=false为模糊匹配方式。

/**
 * 比对两份excel或者两份sheet是否相同 有精准匹配/模糊匹配两种方式
 * @author AnndyTou
 * @Time 2018-07-17
 * @Detail  
 * */
import java.util.ArrayList;
import java.util.List;

/**
 * 调用RWExcel.java 获取两份excel封装成ArrrayList集合 通过集合的下标进行比对
 */

public class CompareTwoExcels {

	private String exportExcelFilePath;
	private String WebExcelFilePath;
	private boolean isPerfectMatch;

	/**
	 * 构造方法
	 * @isPerfectMatch 表示是否需要完全匹配
	 */

	public CompareTwoExcels(String exportExcelFilePath, String WebExcelFilePath, boolean isPerfectMatch) {

		this.exportExcelFilePath = exportExcelFilePath;
		this.WebExcelFilePath = WebExcelFilePath;
		this.isPerfectMatch = isPerfectMatch;
	}

	/**
	 * 逻辑比对
	 */

	public void comparedExcels(int exportExcelSheetNum, int WebExcelSheetNum) {

		RWExcel excel = new RWExcel(exportExcelFilePath, WebExcelFilePath);

		ArrayList<List> exportExcel_list = excel.ReadExcel(exportExcelSheetNum);

		ArrayList<List> WebExcel_list = excel.ReadAnotherExcel(WebExcelSheetNum);
		// 条件判断是否完全匹配方式去匹配两份excel
		if (isPerfectMatch) {
			// 以web端获取的excel报表为参考 比对导出的excel报表
			for (int i = 1; i <= WebExcel_list.size(); i++) {
				List list1 = WebExcel_list.get(i-1);
				List list2 = exportExcel_list.get(i-1);
				
				if (list2.equals(list1)) {
					String infos = "Success-----报表第" + i + "行完全匹配-------成功";
					System.out.println(infos);
				} else {
					String infos = "Fail-----报表第" + i + "行Web端与导出的报表不匹配-------失败";
					System.out.println(infos);
				}
			}

		}else if(!isPerfectMatch){
			// 以web端获取的excel报表为参考 比对导出的excel报表
			for (int i = 1; i <= WebExcel_list.size(); i++) {
				List list1 = WebExcel_list.get(i-1);
				List list2 = exportExcel_list.get(i-1);
				
				if(list1.size() > list2.size()){
					System.out.println("Fail-----第"+i+"行Web端大于导出的报表长度-------失败");
				}else if(list1.size() < list2.size()){
					System.out.println("Fail-----第"+i+"行Web端小于导出的报表长度-------失败");
				}else{
					for(int j = 1;j<= list1.size(); j++){
						
						if(list2.contains(list1.get(j-1))){
							System.out.println("Success-----第"+i+"行第"+j+"列Web端与导出的报表匹配-----成功");
						}else{
							System.out.println("Fail-----第"+i+"行第"+j+"列Web端与导出的报表不匹配----------失败");
						}
					}
				}
			}
		}
	}
	
	/**
	 * 调试方法
	 * */
	
	public static void main(String[] args) {
		//第一份excel为web端抓取的excel  第二份excel为导出的excel false表示不精准匹配
		CompareTwoExcels excels = new CompareTwoExcels("D:\\345.xls", "D:\\345.xls", false);
		//选择xls的sheet下标
		excels.comparedExcels(0, 1);

	}

}

3:针对上面的读取excel不完全匹配的情况下的改进,将ArrayList改成HashList HashList会自动删除重复的数据并且按照hashcode对集合中的字符串进行排序

package test;

/**
 * 比对两份excel或者两份sheet是否相同 有精准匹配/模糊匹配两种方式
 * @author AnndyTou
 * @Time 2018-07-17
 * @Detail  
 * */
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * 调用RWExcel.java 获取两份excel封装成ArrrayList集合 通过集合的下标进行比对
 */

public class CompareTwoExcels {

	private String exportExcelFilePath;
	private String WebExcelFilePath;
	private boolean isPerfectMatch;

	/**
	 * 构造方法
	 * 
	 * @isPerfectMatch 表示是否需要完全匹配
	 */

	public CompareTwoExcels(String exportExcelFilePath, String WebExcelFilePath, boolean isPerfectMatch) {

		this.exportExcelFilePath = exportExcelFilePath;
		this.WebExcelFilePath = WebExcelFilePath;
		this.isPerfectMatch = isPerfectMatch;
	}

	/**
	 * 逻辑比对
	 */

	public void comparedExcels(int exportExcelSheetNum, int WebExcelSheetNum) {

		RWExcel excel = new RWExcel(exportExcelFilePath, WebExcelFilePath);

		ArrayList<List> exportExcel_list = excel.ReadExcel(exportExcelSheetNum);

		ArrayList<List> WebExcel_list = excel.ReadAnotherExcel(WebExcelSheetNum);
		// 条件判断是否完全匹配方式去匹配两份excel
		if (isPerfectMatch) {
			// 以web端获取的excel报表为参考 比对导出的excel报表
			for (int i = 1; i <= WebExcel_list.size(); i++) {
				List list1 = WebExcel_list.get(i - 1);
				List list2 = exportExcel_list.get(i - 1);

				if (list2.equals(list1)) {
					String infos = "Success-----报表第" + i + "行完全匹配-------成功";
					System.out.println(infos);
				} else {
					String infos = "Fail-----报表第" + i + "行Web端与导出的报表不匹配-------失败";
					System.out.println(infos);
				}
			}

		} else if (!isPerfectMatch) {
			// 以web端获取的excel报表为参考 比对导出的excel报表
			for (int i = 1; i <= WebExcel_list.size(); i++) {
				List list1 = WebExcel_list.get(i - 1);
				List list2 = exportExcel_list.get(i - 1);
				//根据HashSet的特点 不能存储重复的数据 并且狐疑按照码表进行排列 所有 HashSet集合可以忽视顺序
				Set<String> hashSet1 = new HashSet<>();
				Set<String> hashSet2 = new HashSet<>();

				if (list1 != null && list2 != null) {

					for (int q = 0; q < list1.size(); q++) {

						hashSet1.add((String) list1.get(q));
					}

					for (int v = 0; v < list2.size(); v++) {

						hashSet2.add((String) list2.get(v));
					}
				}
				//调试
				//System.out.println(hashSet1.toString()+"=========="+hashSet2.toString());
				
				

				if (hashSet2.size() != hashSet1.size()) {
					System.out.println("Fail-----第" + i + "行Web端与导出的报表长度不等-------失败");
					
					//System.out.println(hashSet1.toString()+"=========="+hashSet2.toString());
				}else {
					if(hashSet2.equals(hashSet1)){
						
						System.out.println("Success-----第" + i + "行Web端与导出的报表匹配-------成功");
					}else{
						System.out.println("Fail-----第" + i + "行Web端与导出的报表长度不等-------失败");
					}
					
					//System.out.println(hashSet1.toString()+"=========="+hashSet2.toString());
				}
			}
		}
	}

	/**
	 * 调试方法
	 */

	public static void main(String[] args) {
		// 第一份excel为web端抓取的excel 第二份excel为导出的excel false表示不精准匹配
		CompareTwoExcels excels = new CompareTwoExcels("D:\\345.xls", "D:\\345.xls", true);
		// 选择xls的sheet下标
		excels.comparedExcels(0, 1);

	}
	
	/**
	 * 封装一个方法 统计一个字符串在一个set集合中的个数  在本class中没有用武之地
	 * */
	
	public int setList(Set<String> hashSet , String str){
		
		int count = 0;
		
		//set集合不能使用get(index)的方法取值
		Iterator<String> iterator = hashSet.iterator();
		
		while(iterator.hasNext()){
			
			if(str.equals(iterator.next())){
				
				count++;
			}
		}
		
		return count;

	}
	
	/**
	 * 比较
	 * */

}

 

武汉派先科技有限公司推出的<>专业版是市场上最为强大便捷的Excel比较工具。它为工作中经常需要进行数据比较的用户提供了完美的解决方案。无论你的数据是存放在Excel文件,还是存放在文本文件,或者存放在Access、Microsoft SQL数据库,<>专业版都可以提供快速比较,大量节省您的时间和精力,将您从枯燥冗长的数据海洋中解放出来,从而让您的工作变得轻松愉快。 <>专业版不同于其它同类产品。其它同类产品在比较时候,要么是一个插件,要么需要显式地在前台运行Excel程序。而百分百比较Excel完全独立运行,与后台的Excel程序协同完成工作,不需要来回切换程序。 本产品的主要特性点: 1、 支持对任意Excel内容的比较比较整个工作簿(workbook),并且可以对工作簿中的每个工作表进行单独的比较设置 • 比较整个工作表(worksheet),并允许多种比较设置 • 比较工作表中的已命名区域(named range),并允许多种比较设置 • 比较工作表中用户运行时自由选定的任何区域(range),并允许多种比较设置 2、 支持对远程数据比较 • 支持从文本文件(Text/CSV)中导入数据比较 • 支持从Access数据库中导入数据比较 • 支持从微软SQL数据库中导入数据比较 3、支持灵活的多种比较设置 • 支持按第一行名字配对比较 • 支持按Excel所在列位置配对比较 • 支持按范围(range)内的单元坐标配对比较 (同一坐标的单元配对比较) • 支持用户自由定义的列映射配对比较 • 支持值和公式的比较 • 支持大小写区分 • 所有的比较设置均可保存供下次调用 4、自动生成XML格式的比较结果报表 • XML格式保留对差异单元的加亮显示 • XML格式使您的生意伙伴对比较结果的自动再处理(程序处理)成为可能 • XML格式允许没有安装微软Excel的生意伙伴用互联网浏览器进行显示比对 • XML格式也允许你在Excel中对比较结果进行显式和分析 5、原始Excel文件和比较结果显示在同一个程序窗口中,无需切换 6、可一键快速定位比较结果对应的原始Excel单元 7、独特的比较算法,即使大量的数据也可快速比较 8、友好的用户界面,让你的操作轻松自如.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值