POI一个表格导入这实体list的工具方法-查看文章

POI一个表格导入这实体list的工具方法

发表于:2018-12-25 10:36:51 分类:JAVA 阅读:745次

/**
 * 导入表格
 * @param fieldNames 与表格列一一对应的属性名称
 * @param requiredFieldName 必需的字段名,用以放弃无效数据
 * @param ignoreFields 忽略的字段Set 读取到的实体对应字段的值将不会设备为表格的数据
 * @param clazz 导入数据的类型
 * @param in 导入的文件流
 * @return
 * @throws Exception
 */
public List<T> importExcel2007(String[] fieldNames,String requiredFieldName,Set<String> ignoreFields, Class<T> clazz, InputStream in) throws Exception {
    // 声明一个工作薄
    XSSFWorkbook workbook = new XSSFWorkbook(in);
    List<T> res = new ArrayList<>();
    Iterator<Sheet> iterator = workbook.sheetIterator();
    while (iterator.hasNext()) {
        Sheet sheet = iterator.next();
        //读取当前sheet下的每一行数据
        List<T> list = readRow(sheet,fieldNames,requiredFieldName,ignoreFields, clazz);
        res.addAll(list);
    }
    return res;
}

/**
 * 读取表格的每一行数据,封装为一个指定对象,最后返回对象list
 * @param sheet 表格
 * @param fieldNames 与表格列一一对应的属性名称
 * @param requiredFieldName 必需的字段名,用以放弃无效数据
 * @param ignoreFields 忽略的字段Set 读取到的实体对应字段的值将不会设备为表格的数据
 * @param clazz 导入数据的类型
 * @return
 * @throws Exception
 */
private List<T> readRow(Sheet sheet,String[] fieldNames,String requiredFieldName,Set<String> ignoreFields, Class<T> clazz) throws Exception {
    ArrayList<T> list = new ArrayList<>();
    int lastRowNum = sheet.getLastRowNum();
    int requiredIndex = -1;
    for (int i = 0 ;i<fieldNames.length; i++) {
        if(requiredFieldName.equals(fieldNames[i])){
            requiredIndex = i;
        }
    }
    if(requiredIndex < 0){
        throw new RuntimeException("必需的属性名在属性数组中不存在!");
    }
    Field[] fields = clazz.getDeclaredFields();
    //跳过表头1行
    for (int rowNum = 1; rowNum <= lastRowNum; rowNum++) {
        Row row = sheet.getRow(rowNum);
        boolean isBlankRow = false;
        if(row == null){
            continue;
        }
        T o = clazz.newInstance();
        for (int i = 0; i < fields.length; i++) {
            Cell cell = row.getCell(i);
            if(cell == null && i == requiredIndex){
                isBlankRow = true;
                break;
            }
            if(cell!=null && i<fieldNames.length){
                String fieldName = fieldNames[i];
                //去除被忽略的字段
                if(!ignoreFields.contains(fieldName)){
                    Field field = clazz.getDeclaredField(fieldName);
                    Class<?> type = field.getType();
                    //验证必需的字段,如果没有值就丢弃该行
                    if (i == requiredIndex && !checkRequiredField(cell)) {
                        isBlankRow = true;
                        break;
                    }
                    String setMethodName = "set" + fieldName.substring(0, 1).toUpperCase()
                            + fieldName.substring(1);
                    Method method = clazz.getMethod(setMethodName,type);
                    Object valueObj = readCellValue(cell,type);
                    method.invoke(o, valueObj);
                }
            }
        }
        if(isBlankRow){
            continue;
        }
        list.add(o);
    }
    return list;
}

/**
 * 如果当前单元格为必需字段的话,其必须有值,否则返回false
 * @param cell 待验证的单元格
 * @return
 */
private boolean checkRequiredField(Cell cell) {
    cell.setCellType(CellType.STRING);
    Object v = cell.getStringCellValue();
    if (v == null || StringUtils.isBlank(v.toString())) {
        return false;
    }
    return true;
}

/**
 * 读取单元格的值,并按对象类型转换成对象需要类型
 * @param cell 当前单元格
 * @param type 对象类型 (仅支持Integer,Double,Date类型的明确转换,其它类型将以String类型返回)
 * @return
 */
private Object readCellValue(Cell cell,Class type) {
    Object valueObj;
    try {
        if (type.equals(Integer.class)) {
            cell.setCellType(CellType.NUMERIC);
            valueObj = (int)cell.getNumericCellValue();
        } else if (type.equals(Double.class)) {
            cell.setCellType(CellType.NUMERIC);
            valueObj = cell.getNumericCellValue();
        } else if (type.equals(Date.class)) {
            cell.setCellType(CellType.NUMERIC);
            valueObj = cell.getDateCellValue();
        } else {
            cell.setCellType(CellType.STRING);
            valueObj = cell.getStringCellValue();
        }
    } catch (Exception e) {
        throw new RuntimeException("读取数据出错!");
    }
    return valueObj;
}


关键词:poi,导入,表格


验证码: