java利用poi解析excel表格

引入的依赖

<!--利用poi 读取excel-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

简单说明

主要有四个属性,Workbook(工作表),Sheet(表单),Row(行), Cell(单元格)

需要读取的文件

读取的Excel文件

读取Excel

思路是按照Workbook,Sheet,Row,Cell一层一层往下读取。
首先是初始化Workbook
由于采用工厂模式,所用不用单独去区分excel的版本

/**
     * 获取Excel,将数据转换成 List<String> 的形式
     * Excel 数据要求第一行为对象的属性名称
     * @param filePath
     * @param fileName
     * @return
     * @throws FileNotFoundException
     */
    public static List<List<String>> readExcelToList(String filePath, String fileName) throws FileNotFoundException {
        List<List<String>>   result=new ArrayList<>();
        Workbook workbook = null;
        FileInputStream inputStream = null;
        try {
            // 获取Excel文件
//            File excelFile = new File(fileName);
            File excelFile = new File(filePath + File.separator + fileName);
            if (!excelFile.exists()) {
                logger.warn("指定的Excel文件不存在!");
                return null;
            }
             inputStream = new FileInputStream(excelFile);
            // 使用工厂模式 根据文件扩展名 创建对应的Workbook  xls以及xlxs都可以
             workbook = WorkbookFactory.create(inputStream);
//            Sheet sheet = workbook.getSheet(sheetName);  不根据sheetname获取页面,直接遍历
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                Sheet sheet = workbook.getSheetAt(sheetNum);
                // 校验sheet是否合法
                if (sheet == null) {
                    continue;
                }
                // 获取第一行数据
                int firstRowNum = sheet.getFirstRowNum();
                Row firstRow = sheet.getRow(firstRowNum);
                if (null == firstRow) {
                    logger.warn("解析Excel失败,在第一行没有读取到任何数据!");
                }

                // 解析每一行的数据,构造数据对象
                int rowStart = firstRowNum + 1;
                int rowEnd = sheet.getPhysicalNumberOfRows();
                for (int rowNum = rowStart; rowNum < rowEnd; rowNum++) {
                    Row row = sheet.getRow(rowNum);

                    if (null == row) {
                        continue;
                    }

                    List<String> resultData = convertRowToString(row);

                    if (null == resultData) {
                        logger.warn("第 " + row.getRowNum() + "行数据不合法,已忽略!");
                        continue;
                    }
                    result.add(resultData);
                }

            return   result;

            }
        }catch (Exception e){
            logger.warn("解析Excel失败,文件名:" + fileName + " 错误信息:" + e.getMessage());
            return null;
        }finally {
            try {
                if (null != workbook) {
                    workbook.close();
                }
                if (null != inputStream) {
                    inputStream.close();
                }
            } catch (Exception e) {
                logger.warn("关闭数据流出错!错误信息:" + e.getMessage());
                return null;
            }
        }
        return null;
    }

解析每一行

/**
     * 读取每行中的每列数据
     * 将每列数据转换为String
     * @param row
     * @return
     */
    public static  List<String> convertRowToString(Row row){
        List<String> list=new ArrayList<>();
        Cell cell;
        int cellNum = 0;

        if(row.getLastCellNum()==-1){
            return null;
        }
        //开始读取每行中的每一列数据
        for(int j=0;j<row.getLastCellNum();j++){
            cell = row.getCell(j);
            String var = convertCellValueToString(cell);
            list.add(var);
        }
        return list;
    }

转换单元格内的字符串

/**
     * 将单元格内容转换为字符串
     * @param cell
     * @return
     */
    private static String convertCellValueToString(Cell cell) {
        if(cell==null){
            return null;
        }
        String returnValue = null;
        switch (cell.getCellType()) {
            case NUMERIC:   //数字
                Double doubleValue = cell.getNumericCellValue();

                // 格式化科学计数法,取一位整数
                DecimalFormat df = new DecimalFormat("0");
                returnValue = df.format(doubleValue);
                break;
            case STRING:    //字符串
                returnValue = cell.getStringCellValue();
                break;
            case BOOLEAN:   //布尔
                boolean booleanValue = cell.getBooleanCellValue();
                returnValue = Boolean.toString(booleanValue);
                break;
            case BLANK:     // 空值
                break;
            case FORMULA:   // 公式
                returnValue = cell.getCellFormula();
                break;
            case ERROR:     // 故障
                break;
            default:
                break;
        }
        return returnValue;
    }

参考

Java 利用POI 解析Excel

posted @ 2022-08-22 16:37  HKnight  阅读(443)  评论(0编辑  收藏  举报