PoiExcel导入实现(解决跨行问题以及03和07版本问题)

Posted jiajialeps

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PoiExcel导入实现(解决跨行问题以及03和07版本问题)相关的知识,希望对你有一定的参考价值。

Excel数据导入

需求:需要将多个跨行的数据保存在数据库中,而且数据库中的数据是树形结构,多行多列存在父级关系,数据需要保存父ID。

解决方案: 因为是树形结构,那么表单的数据分区读取,先读取父级的数据存到数据库,再存入子类数据。

第一步:解决Excel版本问题

String originalFileName = file.getOriginalFilename();
    		InputStream is = file.getInputStream();
    		int version = 0;
    		if (originalFileName.endsWith(".xls")) {
    			version = 2003;
    		}else if (originalFileName.endsWith(".xlsx")) {
    			version = 2007;
    		}else {
    			throw new Exception("Incorrect file format,Only allowed ‘.xls,.xlsx‘ extension");
    		}
    		Workbook workbook = null;
    		switch (version) {
    			case 2003:
    				POIFSFileSystem fs = new POIFSFileSystem(new BufferedInputStream(is));
    				workbook = new HSSFWorkbook(fs);
    				break;
    	
    			case 2007:
    				workbook = new XSSFWorkbook(new BufferedInputStream(is));
    				break;
    		}
    		int sheetIndex = workbook.getSheetIndex("云运维成熟度评估要素");
    		Sheet sheet = workbook.getSheetAt(sheetIndex);
		

  

第二步:遍历第二、三列数据存入list便于下一步处理

 List<OcScope> ocScopeListOne = new ArrayList<OcScope>();
String b = "";  String c = ""; 	 int e =0; double w = 0D;
    		for (Row row : sheet) {
    			OcScope ocScope = new OcScope();
    			int rowNum = row.getRowNum();
    			if(e==1){break;}  //当e==1时跳出循环
    			if(rowNum <= 1){//跳出第一行   一般第一行都是表头没有数据意义
    				continue;
    			}
    			int startCell = 1; //
    			if(row.getCell(startCell)!=null ){//第1列数据
  		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
  		          if(!row.getCell(startCell).getStringCellValue().equals("")){  
                        //判空赋值的好处是解决跨行数据 如果下一行没有读到就继续将上一行的数据写入实体
  		        	  
  		        	  if(row.getCell(startCell).getStringCellValue().equals("0")){ //如果数据为0跳出循环
  		        		  e=1;   
  		        	  }else{
  		        		 b = row.getCell(startCell).getStringCellValue();  //不是就赋值
  		        	  }
  		        	
  		          }
  		         
    			}
    			startCell++;
    			if(row.getCell(startCell) == null){
		        	  e=1;
		          }
    			
    			if(row.getCell(startCell)!=null){//第15列
    		    	row.getCell(startCell).setCellType(Cell.CELL_TYPE_NUMERIC);
    		    		 w = row.getCell(startCell).getNumericCellValue();
    		    		     }
    			//解决跨行问题
    			ocScope.setScopeName(b); //只有不为空的时候b才会被从新赋值
    			ocScope.setParentName(null);
    			ocScope.setLevel("1");
    			ocScope.setWeights(w);//只有不为空的时候W才会被从新赋值
    			ocScopeListOne.add(ocScope);
    		}

  

第三步:去重处理(因为处理的是对象,用Map去重是一个不错的解决方案)

Map<String, OcScope> ocScopeMapOne = Maps.newHashMap();
    		Map<String, OcScope>  ocScopeMapTwo = Maps.newHashMap();
    		for (OcScope ocScope : ocScopeListOne) {
    			ocScopeMapOne.put(ocScope.getScopeName(), ocScope);
			}

  

第四步:存入处理(遍历Map存入)

OcScope ocScopeOne = new OcScope();
    		ocScopeOne.setLevel("1");
        	List<OcScope> ocScopelistOne=	ocScopeService.findList(ocScopeOne);  //查询出一级的所有数据
    		for (String key : ocScopeMapOne.keySet()) { //遍历map
    			for (OcScope ocScope1 : ocScopelistOne) {
    				if(!ocScopeMapOne.get(key).getScopeName().equals(ocScope1.getScopeName())){ //与一级的list数据进行对比没有相同的就存入新数据
//    					dao.insert(ocScopeMapOne.get(key));
				}
				}
    		}

  

第五步:从新遍历表格存入下一级数据, 遍历第二、四、五列数据存入list便于下一步处理

b=""; c="";w=0; e =0;  //重新赋值
    		for (Row row : sheet) {
    			OcScope ocScope = new OcScope();
    			int rowNum = row.getRowNum();
    			if(e==1){break;}
    			if(rowNum <= 1){//跳出第一行   一般第一行都是表头没有数据意义
    				continue;
    			}
    			int startCell = 1; //
    			if(row.getCell(startCell)!=null ){//第1列数据
  		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
  		          if(!row.getCell(startCell).getStringCellValue().equals("")){
  		        	 b = row.getCell(startCell).getStringCellValue();
  		          }
  		         
    			}
    			
    			startCell++;
    			startCell++;
    			if(row.getCell(startCell) == null){
		        	  e=1;
		          }
    			if(row.getCell(startCell)!=null){//第3列数据
    		          row.getCell(startCell).setCellType(Cell.CELL_TYPE_STRING);
    		          if(!row.getCell(startCell).getStringCellValue().equals("")){
    		        	  if(row.getCell(startCell).getStringCellValue().equals("0")){
    		        		  e=1;  
    		        	  }else{
    		        		  c = row.getCell(startCell).getStringCellValue();
    		        	  }
    	  		        	
    	  		          }
    		     }
    			    			
    			startCell++;
    			if(row.getCell(startCell)!=null){//第4列
    		    	row.getCell(startCell).setCellType(Cell.CELL_TYPE_NUMERIC);
    		    	if(row.getCell(startCell).getNumericCellValue()!=0.0){
    		    		w = row.getCell(startCell).getNumericCellValue();
    		    	}
    		    		 
    		    	
    		    	}
    			
    		
//    		 转换为Integer类型
    			//解决跨行问题
    			
    			ocScope.setParentName(b); //这里需要存一个父级的名子
    			ocScope.setScopeName(c);
    			ocScope.setLevel("2");
    			ocScope.setWeights(w);
    			ocScopeListTwo.add(ocScope);
    		}

  

第六步:去重处理+存入处理

for (OcScope ocScope : ocScopeListTwo) { //去重处理
    			ocScopeMapTwo.put(ocScope.getScopeName(), ocScope);
			}


	 OcScope ocScopeTwo = new OcScope();
    		 ocScopeTwo.setLevel("2");
    	List<OcScope> ocScopelistTwo=	ocScopeService.findList(ocScopeTwo); //取出二级的List数据
        for (String key : ocScopeMapTwo.keySet()) {   //遍历map
    			for (OcScope ocScope1 :  ocScopelistOne) {
    				if(ocScopeMapTwo.get(key).getParentName().equals(ocScope1.getScopeName())){  //给对象赋值父ID根据值判断
    					ocScopeMapTwo.get(key).setParentId(ocScope1.getId());
        			}
				}
    		}
    		System.err.println("ocScopeMapTwo+Pid"+ocScopeMapTwo);
    		for (String key : ocScopeMapTwo.keySet()) {  //遍历map
    			for (OcScope ocScope1 : ocScopelistTwo) {  
    				if(!ocScopeMapTwo.get(key).getScopeName().equals(ocScope1.getScopeName())){//数据库没有相关数据就存入进去
//    					dao.insert(ocScopeMapOne.get(key));
				}
				}
    				
    		}

  

以上是关于PoiExcel导入实现(解决跨行问题以及03和07版本问题)的主要内容,如果未能解决你的问题,请参考以下文章

poi 解析excel问题

Pandas 跨行的最小值和最大值

Android 可跨行高

跨行业如何学习好python?Python学习!

记录一下自己用Java实现Excel表格的导入导出以及Excel表格更改后保存,但读取的还是没更改前的文件问题的解决办法

记录一下自己用Java实现Excel表格的导入导出以及Excel表格更改后保存,但读取的还是没更改前的文件问题的解决办法