用poi将excel 解析成list套map的格式

public List<Map<String, Object>> readExcel(InputStream inputStream) throws Exception {
		int sheetnum=0,startrow=0,startcol=0;
		List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
		try {
            HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
            HSSFSheet sheet = workbook.getSheetAt(sheetnum);                     //sheet 从0开始
            int rowNum = sheet.getLastRowNum() + 1;                     //取得最后一行的行号
            Map<String, Object> Header=new HashMap<String, Object>();   //表头的下标和内容
            for (int i = startrow; i < rowNum; i++) {                    //行循环开始
            	Map<String, Object> map=null;//每一行数据的map
                HSSFRow row = sheet.getRow(i);                             //行
                if(row==null) break; //中间如果有空行,则退出
                int cellNum = row.getLastCellNum();                     //每行的最后一个单元格位置
                if(i!=0){//记录数据的行号
                	map=new HashMap<String, Object>();
                	map.put("lineNumber", i+1);
                }
                for (int j = startcol; j < cellNum; j++) {               //列循环开始
                	HSSFCell cell2 = row.getCell(j);
                	//HSSFCell cell = row.getCell(Short.parseShort(j + ""));
                    //String cellValue = getCellValue(cell, format);
                    String cellValue = getCellValue(cell2);
                    //如果当前行的第一列为空,则跳过该行
                    /*if(j==0 && ("".equals(cellValue)||null==cellValue)){
                    	break;
                    }*/
                    if(i==0){
                    	Header.put(j+"", cellValue);
                    }else{
                    	map.put((String)Header.get(j+""), cellValue);
                    }
                }
                //每一行数据的过滤,如果一行中所有列都为null,则不生成该行数据,
                if(null!=map){
                	Collection<Object> values = map.values();
                	Set<String> keySet = map.keySet();
                	long count2 = keySet.stream().filter(o -> !o.equals("lineNumber")).count();//总条数
                	long count = values.stream().filter(o -> null==o).count();//为空的条数
                	if(count<count2){
                		list.add(map);
                	}
                }
            }
            workbook.close();
        } catch (Exception e) {
            throw e;
        }
		return list;
	}






/** 
     * 根据excel单元格类型获取excel单元格值 
     * @param cell 
     * @return 
     */  
    private String getCellValue(HSSFCell cell) {  
        String cellvalue = null;  
        if (cell != null) {  
            // 判断当前Cell的Type  
            switch (cell.getCellType()) {  
            // 如果当前Cell的Type为NUMERIC  
            case HSSFCell.CELL_TYPE_NUMERIC: {  
                short format = cell.getCellStyle().getDataFormat();  
                if(format == 14 || format == 31 || format == 57 || format == 58){   //excel中的时间格式  
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");    
                    double value = cell.getNumericCellValue();    
                    Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);    
                    cellvalue = sdf.format(date);    
                }  
                // 判断当前的cell是否为Date  
                else if (HSSFDateUtil.isCellDateFormatted(cell)) {  //先注释日期类型的转换,在实际测试中发现HSSFDateUtil.isCellDateFormatted(cell)只识别2014/02/02这种格式。  
                    // 如果是Date类型则,取得该Cell的Date值           // 对2014-02-02格式识别不出是日期格式  
                    Date date = cell.getDateCellValue();  
                    DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");  
                    cellvalue= formater.format(date);  
                } else { // 如果是纯数字  
                    // 取得当前Cell的数值  
                    cellvalue = NumberToTextConverter.toText(cell.getNumericCellValue());   
                      
                }  
                break;  
            }  
            // 如果当前Cell的Type为STRIN  
            case HSSFCell.CELL_TYPE_STRING:  
                // 取得当前的Cell字符串  
                cellvalue = cell.getStringCellValue().replaceAll("'", "''");  
                break;  
            case  HSSFCell.CELL_TYPE_BLANK:  
                cellvalue = null;  
                break;  
            // 默认的Cell值  
            default:{  
                cellvalue = "";  
            }  
            }  
        } else {  
            cellvalue = "";  
        }  
        return cellvalue;  
    }


传入一个流,返回List<Map<String,String>>  ,获取时,先获取对应的行,在通过表头获得单元格的值


猜你喜欢

转载自blog.csdn.net/qq_31683775/article/details/79276550
今日推荐