Java解析导入Excel表数据

由于Java项目中需要用到对导入的Excel表数据进行解析的功能,通过网上的一些资料和自己项目中的实际运用,对Excel解析的过程进行一下记录:

一、初始化

   public List<List<List<String>>> parseExcel(MultipartFile file) {
        if (file == null || "".equals(file.getOriginalFilename().trim())) {
            return null;
        } else {
            try {
                Workbook workbook = initWorkBook(file);
                if (workbook != null) {
                    List<List<List<String>>> results = new ArrayList<>();
                    int numOfSheet = workbook.getNumberOfSheets();
                    // 解析sheet
                    for (int i = 0; i < numOfSheet; i++) {
                        Sheet sheet = workbook.getSheetAt(i);
                        List<List<String>> parseSheet = parseExcelSheet(sheet);
                        results.add(parseSheet);
                    }
                    return results;
                }else {
                    return null;
                }
            }catch (IOException e) {
                return null;
            }
        }
    }

    Workbook initWorkBook(MultipartFile file) throws IOException {
        String postfix = getPostfix(file.getOriginalFilename());
        if (!"".equals(postfix)) {
            InputStream input = file.getInputStream();
            Workbook workbook = null;
            if ("xls".equals(postfix)) {
                workbook = new HSSFWorkbook(input);
            } else if ("xlsx".equals(postfix)) {
                workbook = new XSSFWorkbook(input);
            }
            return workbook;
        }else {
            return null;
        }
    }


    /** 
     * 获得path的后缀名 
     * @param path 
     * @return 
     */  
    private String getPostfix(String path){  
        if(path==null || EMPTY.equals(path.trim())){  
            return "";  
        }  
        if(path.contains(".")){  
            return path.substring(path.lastIndexOf(".") + 1, path.length());  
        }  
        return "";  
    }  

二、解析sheet

    /**
     * 解析每一个sheet数据
     * */
    private List<List<String>> parseExcelSheet(Sheet sheet) {
        Row row;
        int count = 0;
        List<List<String>> results = new ArrayList<>();
        int realRow = getExcelRealRow(sheet);
        short cellNum = 0;
        for (int i = 0; i < realRow; i++) {
            row = sheet.getRow(i);
            if (i == 0) {
                cellNum = row.getLastCellNum();
            }else {
                System.out.println("行数:"+ cellNum);
                List<String> parseRow = parseExcelRow(row, cellNum);
                results.add(parseRow);
            }
        }
        return results;
    }

需要注意的是,为了避免出现空的数据导致行数被识别多的情况,我们必须判断一下真实的行数:

    // 获取Excel表的真实行数
    int getExcelRealRow(Sheet sheet) {

        CellReference cellReference = new CellReference("A4");
        boolean flag = false;
        System.out.println("总行数:"+(sheet.getLastRowNum()+1));
        for (int i = cellReference.getRow(); i <= sheet.getLastRowNum();) {
            Row r = sheet.getRow(i);
            if(r == null) {
                // 如果是空行(即没有任何数据、格式),直接把它以下的数据往上移动
                sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
                continue;
            }
            flag = false;
            for(Cell c:r) {
                if(c.getCellType() != Cell.CELL_TYPE_BLANK){
                    flag = true;
                    break;
                }
            }
            if(flag) {
                i++;
                continue;
            }else {
                // 如果是空白行(即可能没有数据,但是有一定格式)
                if(i == sheet.getLastRowNum())// 如果到了最后一行,直接将那一行remove掉
                    sheet.removeRow(r);
                else//如果还没到最后一行,则数据往上移一行
                    sheet.shiftRows(i+1, sheet.getLastRowNum(),-1);
            }
        }
        System.out.println("总行数:"+(sheet.getLastRowNum()+1));
        return sheet.getLastRowNum()+1;
    }

三、解析row

    /**
     * 解析每一个row数据
     * */
    private List<String> parseExcelRow(Row row, int count) {

        List<String> results = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            Cell cell = row.getCell(i);
            if (cell == null) {
                results.add("");
            }else {
                // 定义每一个cell的数据类型
                cell.setCellType(Cell.CELL_TYPE_STRING);
                // 取出cell中的value
                results.add(cell.getStringCellValue());
            }
        }
        return results;
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 使用首先需要了解他的工作原理 1.POI结构与常用类 (1)创建Workbook和Sheet (2)创建单元格 (...
    长城ol阅读 8,553评论 2 25
  • 转自链接 3.项目实践 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一张工资单 3....
    腿毛裤阅读 3,562评论 0 0
  • 忘了有多久没有跟别人谈起我的过往了。那些尘埃的往事,我已深埋在心底,不再翻起。却又经不起风浪,一触即溃。 1. 最...
    菫年阅读 721评论 3 7
  • 2017-09-18摘抄自W3school-jQuery 遍历希望帮助自己系统地打好基础,也能在做笔记的同时添加一...
    moralok阅读 109评论 0 0
  • 谨防一个项目的失败。这个失败可能带来经济损失,或者由于缺少资金,让项目中途流产。虚假和不可靠的朋友起到了破坏作用。
    塔罗师阅读 788评论 0 0