poi读取excel处理,包含空行处理

之前项目有个读取excel数据并落库的处理,因为没有处理空行导致失败。 

//读取解析文件将其数据存放在List中
    public List ReadFromExcel(String fileName){ 
        List result=new ArrayList();
        File file=new File(fileName);
        try{
            InputStream in = new FileInputStream(file);
            Workbook wb=WorkbookFactory.create(in);
            Sheet sheet=wb.getSheetAt(0);
            int len=sheet.getLastRowNum()+1;
            for(int i=1;i<len;i++){
                Row row= sheet.getRow(i);

               if(IsRowEmpty(row)){
                   continue;
               }
                Row  rowtitle=sheet.getRow(0);
                int lenj=row.getLastCellNum();
                HashMap rowMap=new HashMap();
                HashMap map=new HashMap();
                for(int j=0;j<lenj;j++){
                    Cell  cell = row.getCell(j);
                    Cell cellTitle=rowtitle.getCell(j);
                    String titleStr=getCellValue(cellTitle);
                    String str=getCellValue(cell);
                    map.put(titleStr, str);
                }
                rowMap.put(i-1, map);
                result.add(rowMap);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        return result;
     }

//获取单元格的值  
    @SuppressWarnings("unused")
    public String getCellValue( Cell cell) {  
        String cellValue = "";  
        DataFormatter formatter = new DataFormatter();  
        if (cell != null) {  
            //判断单元格数据的类型,不同类型调用不同的方法  
            switch (cell.getCellType()) {  
                //数值类型  
                case Cell.CELL_TYPE_NUMERIC:  
                    //进一步判断 ,单元格格式是日期格式   
                    if (DateUtil.isCellDateFormatted(cell)) {
                        Date date=cell.getDateCellValue();
                        cellValue=new SimpleDateFormat("yyyy-MM-dd").format(date);
                        //cellValue = formatter.formatCellValue(cell);  
                    } else {  
                        //数值  
                        double value = cell.getNumericCellValue();  
                        int intValue = (int) value;  
                        cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);  
                    }  
                    break;  
                case Cell.CELL_TYPE_STRING:  
                    cellValue = cell.getStringCellValue();  
                    break;  
                case Cell.CELL_TYPE_BOOLEAN:  
                    cellValue = String.valueOf(cell.getBooleanCellValue());  
                    break;  
                    //判断单元格是公式格式,需要做一种特殊处理来得到相应的值  
                case Cell.CELL_TYPE_FORMULA:{  
                    try{  
                        cellValue = String.valueOf(cell.getNumericCellValue());  
                    }catch(IllegalStateException e){  
                        cellValue = String.valueOf(cell.getRichStringCellValue());  
                    }  
                      
                }  
                    break;  
                case Cell.CELL_TYPE_BLANK:  
                    cellValue = "";  
                    break;  
                case Cell.CELL_TYPE_ERROR:  
                    cellValue = "";  
                    break;  
                default:  
                    cellValue = cell.toString().trim();  
                    break;  
            }  
        }  
        return cellValue.trim();  
    }

//判断读取excel是否空行  空行时返回true 非空行直接返回false

 public static boolean IsRowEmpty(Row row){
        for(int i=row.getFirstCellNum();i<row.getLastCellNum();i++){
            Cell cell=row.getCell(i);
            if(cell!=null&&cell.getCellType()!=cell.CELL_TYPE_BLANK){
                return false;
            }
        }
        return true;
    }

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用POI读取Excel文件时,如果遇到大量的空行,可能会导致内存溢出的问题。这是因为POI读取Excel文件时会将整个文件的内容全部加载到内存中,而空行并没有实际的数据内容,但仍然会占用内存空间。 解决这个问题的方法有以下几种: 1. 使用逐行读取的方式:通过POI提供的API,可以逐行读取Excel文件的内容,而不是将整个文件加载到内存中。这样可以有效地避免空行占用过多的内存空间。 2. 添加筛选条件:在读取Excel文件时,可以添加筛选条件,只读取有效的数据行,而忽略空行。可以通过判断某一行是否为空行的方式,进行过滤。 3. 设置最大行数限制:可以设置最大行数的限制,当达到设定的最大行数时,停止继续读取Excel文件。这样可以避免读取过多的空行,从而减少内存占用。 4. 对大文件进行分块处理:如果Excel文件太大,无法完全加载到内存中,可以将文件进行分块处理,每次读取一部分内容,然后进行处理,这样可以避免一次性读取整个文件导致内存溢出。 需要注意的是,以上方法仅仅是针对空行导致的内存溢出问题,如果Excel文件本身非常大,仍然可能会出现内存溢出的情况。为了避免此类问题,可以考虑采取其他的解决方案,例如使用数据库进行存储和查询,或者使用分布式处理处理大规模的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值