java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)

一:先在E盘准备两个excel,后缀名分别是xls,xlsx。

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第1张图片

二:看一下两个excel里分面有什么内容。

1.xlsx中含有sheet1和sheet2。

sheet1中有三条记录,并且在表头上方有一个“说明”单元格,当然这个说明的内容不是我们需要的,在程序中需要过虑掉,第五行无数据,在程序中也是需要过滤掉的。

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第2张图片

 

sheet2中有2条记录,“第二中学”的这行记录中,姓名这一列没有内容,这一行数据不完整,程序也是需要过滤掉这行记录的。

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第3张图片

 

2.xls文件中含有sheet1和sheet2。

sheet1中有三条记录,里面排版样式和1.xlsx一致,不多说了。。。。

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第4张图片

 

sheet2中没有任何记录

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第5张图片

 

下面开始写程序:

package utils;

import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.util.*;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelUtil {

    public static void main(String[] args) {
        File file = new File("E:/1.xlsx");
        // File file = new File("E:/2.xls");
        try {
            List list = importExcel(file);
            System.out.println();
            System.out.println("---------------------分隔---------------------");
            System.out.println();
            System.out.println(list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static List importExcel(File file) throws Exception {
        Workbook wb = null;
        String fileName = file.getName();// 读取上传文件(excel)的名字,含后缀后
        // 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
        Iterator sheets = null;
        List returnlist = new ArrayList();
        try {
            if (fileName.endsWith("xls")) {
                wb = new HSSFWorkbook(new FileInputStream(file));
                sheets = wb.iterator();
            } else if (fileName.endsWith("xlsx")) {
                wb = new XSSFWorkbook(new FileInputStream(file));
                sheets = wb.iterator();
            }
            if (sheets == null) {
                throw new Exception("excel中不含有sheet工作表");
            }
            // 遍历excel里每个sheet的数据。
            while (sheets.hasNext()) {
                System.out.println("-----遍历sheet-----");
                Sheet sheet = sheets.next();
                List list = getCellValue(sheet);
                System.out.println(list);
                returnlist.add(list);
            }
        } catch (Exception ex) {
            throw ex;
        } finally {
            if (wb != null) wb.close();
        }
        return returnlist;
    }


    // 获取每一个Sheet工作表中的数。
    private static List getCellValue(Sheet sheet) {
        List list = new ArrayList();
        // sheet.getPhysicalNumberOfRows():获取的是物理行数,也就是不包括那些空行(隔行)的情况
        for (int i = sheet.getFirstRowNum(); i < sheet.getPhysicalNumberOfRows(); i++) {
            Map map = new HashMap<>();
            // 获得第i行对象
            Row row = sheet.getRow(i);
            if (row == null) {
                continue;
            } else {
                // getLastCellNum:获取列数(比最后一列列标大1)
                // 通常导入的excel是符合需求规范的,这里因为我们准备的excel列数是7列,如果小于7列说明传入的excel文件有问题。
                if (row.getLastCellNum() < 7) {
                    continue;
                }
                int j = row.getFirstCellNum();// 获取第i行第一个单元格的下标
                // 学校名称这一列必然是字符串,所有直接使用getStringCellValue()获取单元格内容
                String schoolName = row.getCell(j++).getStringCellValue();// 学校
                if (StringUtils.isEmpty(schoolName)) {
                    continue;
                }
                map.put("schoolName", schoolName);

                String name = row.getCell(j++).getStringCellValue();// 姓名
                if (StringUtils.isEmpty(name)) {
                    continue;
                }
                map.put("name", name);

                Cell cell = row.getCell(j++);// 学号(在excel中,学号可能是纯数字,也可能是字母在数字)
                if (cell.getCellTypeEnum().equals(CellType.STRING)) {// 如果是字符串,直接获取值
                    map.put("sn", cell.getStringCellValue());
                } else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) {
                    // 如果excel中学号是纯数字,获取的值是数值类型,再toPlainString()转为字符类型,因为数据库中学号字段需要是字符类型。
                    map.put("sn", new BigDecimal(cell.getNumericCellValue()).toPlainString());
                }

                cell = row.getCell(j++);// 年级(数据库中,年级是int类型,所以这里我们转换为int)
                if (cell.getCellTypeEnum().equals(CellType.STRING)) {
                    try {
                        String gradeStr = cell.getStringCellValue();
                        //
                        int grade = Integer.parseInt(gradeStr);
                        map.put("grade", grade);
                    } catch (Exception e) {
                        continue;
                    }
                } else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) {
                    map.put("grade", (int) cell.getNumericCellValue());
                }

                cell = row.getCell(j++);// 班级(数据库中,年级是int类型,所以这里我们转换为int)
                if (cell.getCellTypeEnum().equals(CellType.STRING)) {
                    try {
                        String klassStr = cell.getStringCellValue();
                        int klass = Integer.parseInt(klassStr);
                        map.put("klass", klass);
                    } catch (Exception e) {
                        continue;
                    }
                } else {
                    map.put("klass", (int) cell.getNumericCellValue());
                }

                String genderStr = row.getCell(j++).getStringCellValue();
                int gender = "男".equals(genderStr) ? 1 : "女".equals(genderStr) ? 0 : 2;
                map.put("gender", gender);

                if (j <= row.getLastCellNum()) {
                    cell = row.getCell(j++);// 手机号
                    if (cell.getCellTypeEnum().equals(CellType.STRING))
                        map.put("phone", cell.getStringCellValue());
                    else if (cell.getCellTypeEnum().equals(CellType.NUMERIC)) map.put("phone",
                            new BigDecimal(cell.getNumericCellValue()).toPlainString());
                }
                list.add(map);
            }
        }
        return list;
    }



}

先导入1.xlsx,从控制台可以看出:

sheet1中的三条记录都读取到了,sheet2中虽然有两行记录,但程序中做了判断,如果学校或者姓名这两列如果为空,那认为这行记录是不完整的,未加入到list里面。

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第6张图片

 

导入2.xls,从控制台可以看出:

sheet1中的三条记录都读取到了,sheet2中没有数据,所有list中为空

java 使用POI导入excel表中多个sheet数据,支持xls,xlsx格式(简单实用)_第7张图片

 

 

你可能感兴趣的:(JAVA)