java 解析excel

Java 使用POI 解析excel文件,返回List<List<List>>, 分别为sheet,row,cell三层数据;
封装代码:

public class ImportExcel {

    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 || "".equals(path.trim())){
            return "";
        }
        if(path.contains(".")){
            return path.substring(path.lastIndexOf(".") + 1, path.length());
        }
        return "";
    }
    /**
     * 解析每一个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数据
     * */
    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;
    }
}

猜你喜欢

转载自blog.csdn.net/naihe0420/article/details/84891242
今日推荐