美文网首页我爱编程Java
Java解析导入Excel表数据

Java解析导入Excel表数据

作者: Hanten | 来源:发表于2018-04-17 09:48 被阅读184次

由于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;
    }

相关文章

  • Java解析导入Excel表数据

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

  • 数据导入

    数据导入——Excel 文本导入 数据库导入数据量大选择透视表 网站导入

  • excel表数据的导入导出

    从excel表导入MySQL数据库 从MySQL数据库写入excel表 PostgreSQL可参考:

  • excel解析问题

    项目里excel的空格解析错误 excel里的数据 导入到java 里 空格莫名其妙的没有了。。 因为代码里给替换...

  • POI实现EXCEL导入

    Java开发过程中,有些需求需要实现Excel导入功能,具体就是Excel导入数据直接操作数据库,先将Excel导...

  • 知识图谱

    数据源 知识图谱数据源接入支持 Excel导入、JY接入、SQL导入、CLASS解析、文档自然语言解析处理 Exc...

  • 将Excel数据导入SQLServer

    一、在Excel中创建工作表Person; 二、打开SqlServer的导入和导出数据; 三、将数据导入已存在表;

  • java读取excel日期为数字的问题

    最近在搞java项目导入Excel数据,在读取日期的时候出现了问题。Excel数据 在导入的时候出现下面问题,日期...

  • DBeaver导入csv中文乱码问题解决

    DBeaver支持csv数据导入和表数据导入,导入csv数据的时候,发现中文乱码,查了查资料发现excel默认的编...

  • Power Query如何处理隐藏工作表的操作?

    之前有对从Excel数据导入的方式有做解释,在导入Excel文件时可以有多个数据类型方式供导入选择,包括超级表,名...

网友评论

    本文标题:Java解析导入Excel表数据

    本文链接:https://www.haomeiwen.com/subject/nnqukftx.html