java 导入解析excel

版权声明:本文为博主原创文章,未经博主允许不得转载。否则,吔屎伺候。 https://blog.csdn.net/guowujun321/article/details/82970266

暂且记录一下吧

假如有一个excel需要导入,那无非类似:

日期 中文名 年龄 性别
2018-10-08 阿毛 23
20181008 sjsj sdfa 人妖

对该excel的解析:

1、先是表头,是否和规定的一致。

2、获取除表头外的每一行 ,每一行中,各列的数据判断,出现错误的返回内容。

3、每一行是一个对象,所有行组成集合。

office不同版本的excel后缀有xls,xlsx,所以在使用poi解析时,需要注意。

public Map<String, Object> analyzeFile(File file) {
    Map<String,Object> map = new HashMap<String,Object>();
    List<Integer> errorRow = new ArrayList<Integer>();
    try {
        
        FileInputStream is = new FileInputStream(file);
        Workbook hssfWorkbook = null;
        try {
            hssfWorkbook = new HSSFWorkbook(is);
        } catch (Exception ex) {
            is = new FileInputStream(file);
            hssfWorkbook = new XSSFWorkbook(is);
        }
    
        Sheet hssfSheet = hssfWorkbook.getSheetAt(0);   //excel可能有多个sheet,一般取第一个
        if (hssfSheet!=null) {
            Row row = hssfSheet.getRow(1);              //得到该sheet里的第一行,即表头行
            boolean title = getTitle(row, map, ReportsTitle.ProductionBudgetSub);   //判断表头是否符合
            if (!title) {
                return map;                                                         //表头有误,就返回错误信息
            }
            List<XX> list = new ArrayList<XX>();
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {   //rowNum是行数,一般下标从1开始,因为数据从第二行开始。
                try {
                    Row hssfRow = hssfSheet.getRow(rowNum);
                    if (hssfRow == null){
                        continue;
                    }
                    
                    Map<String,Object> resultMap = getProductBuget(hssfRow);        //数据行无误,获取并判断
                } catch (Exception e) {
                    errorRow.add(rowNum);
                    map.put("errorRow", errorRow);
                    map.put("result", "error");
                    e.printStackTrace();
                }
            }
            return map;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private Map<String, Object> getProductBuget(Row hssfRow) {
    Map<String,Object> map = new HashMap<String,Object>();
    XX budget = new XX();
    try {

        //取出每列名
        String fieldNamesCNStr = PropertiesUtil.getValueByKey(ReportTitlePath, ReportsTitle.ProductionBudgetAll.name());
        
        //每列的字段名称(建议跑个main方法,从对象的反射中获取,比较方便)
        String fieldNameStr = "date,chineseName,age,sex";

        //名称==字段名,一一对应
        String[] fieldNamesCN = fieldNamesCNStr.split(",");
        String[] fieldNames = fieldNameStr.split(",");
        
        //需要正则校验的字段
        Map<String,DataType> needCheck = new HashMap<String,DataType>();
        needCheck.put("date",DataType.Date);

        //利用反射机制,取出excel中对应的字段的值
        map = ObjectFieldUtil.setFieldValueByImport(fieldNames,fieldNamesCN,needCheck,budget,hssfRow);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return map;
}
public static Map<String,Object> setFieldValueByImport(String[] fieldNames, String[] fieldNamesCN,Map<String,DataType> needCheck, Object object, Row hssfRow) {
        Map<String,Object> map = new HashMap<String,Object>();
        try {
            boolean isNc = false;
            if (needCheck != null && !needCheck.isEmpty()) {        //是否需要校验字段
                isNc = true;
            }
            for(int i = 0,length = fieldNames.length; i < length;i++) {
                String name = fieldNames[i];               //取得字段
                Field field = object.getClass().getDeclaredField(name);
                
                String upperName = name.substring(0, 1).toUpperCase() + name.substring(1);  
                String type = field.getGenericType().toString();
                
                String fieldValue = "";
                if (hssfRow.getCell(i) != null) {
                    fieldValue = switchRowType(hssfRow.getCell(i));
                }
                
                if(isNc && needCheck.containsKey(name)) {
                    if (fieldValue.equals("")) {        //数据为空
                        map.put("result", "error");
                        map.put("errorText", fieldNamesCN[i]);
                        map.put("errorCode", ERROR_Null);
                        return map;
                    }
                    DataType dataType = needCheck.get(name);
                    if (!ExcelDataVerify.isCheckRight(dataType, fieldValue)) {      //格式不正确
                        map.put("result", "error");
                        map.put("errorText", fieldNamesCN[i]);
                        map.put("errorCode", dataType.getName());
                        return map;
                    }
                }
                setField(type, upperName, object, i, fieldValue);
            }
            map.put("result", "success");
            map.put("object", object);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("result", "error");
            map.put("errorCode", ERROR_Exep);
        }
        return map;
    }
public static String switchRowType(Cell cell) {
    String ret = "";  
    if (cell == null) return ret;  
    CellType type = cell.getCellTypeEnum();
    switch (type) {  
        case BLANK:  
            ret = "";  
            break;  
        case BOOLEAN:  
            ret = String.valueOf(cell.getBooleanCellValue());  
            break;  
        case ERROR:  
            ret = null;  
            break;  
        case FORMULA:  
            Workbook wb = cell.getSheet().getWorkbook();  
            CreationHelper crateHelper = wb.getCreationHelper();  
            FormulaEvaluator evaluator = crateHelper.createFormulaEvaluator();  
            ret = switchRowType(evaluator.evaluateInCell(cell));  
            break;  
        case NUMERIC:  
            if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {  
                Date theDate = cell.getDateCellValue();  
                ret = sdf_Date.format(theDate);  
            } else {  
                ret = NumberToTextConverter.toText(cell.getNumericCellValue());  
            }  
            break;  
        case STRING:  
            ret = cell.getRichStringCellValue()==null?"":cell.getRichStringCellValue().getString();  
            break;  
        default:  
            ret = "";  
    }  
    return ret;
}
public enum DataType {
    Chinese("应输入中文","[\\u4E00-\\u9FA5]+"),
    Symbol("包含特殊字符","[ _`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\\n|\\r|\\t"),
    Number("应为非负整数","^//d+$"),
    NumNotZero("应为非零整数","^//d*[1-9]//d*$"),
    Email("格式有误","^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"),                                 
    Date("格式有误","^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))")
    ;
    private String name;  
    private String regEx;
    // 构造方法  
    private DataType(String name, String regEx) {  
        this.name = name;  
        this.regEx = regEx;  
    }
    //覆盖方法  
    @Override  
    public String toString() {  
        return this.regEx+"_"+this.name;  
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRegEx() {
        return regEx;
    }
    public void setRegEx(String regEx) {
        this.regEx = regEx;
    }
}
public static void setField(String type,String upperName,Object object,int i,String fieldValue) {
    try {
        Method method = null;
        
        //String fieldValue = switchRowType(hssfRow.getCell(i));
        
        if (type.equals("int")) {
            method = object.getClass().getMethod("set" + upperName,int.class);  
            method.invoke(object, Integer.parseInt(fieldValue));
        }
        if (type.equals("class java.lang.String")) {
            method = object.getClass().getMethod("set" + upperName,String.class);  
            fieldValue = fieldValue == null ?"":fieldValue;
            method.invoke(object, fieldValue);
        }
        if (type.equals("class java.util.Date")) {
            method = object.getClass().getMethod("set" + upperName,Date.class);  
            if (!StringUtils.isBlank(fieldValue)) {
                Date date = new Date();
                if(fieldValue.contains("-")) {
                    date = sdf_Date.parse(fieldValue);
                } else if(fieldValue.contains("/")){
                    date = sdf_Date_fs.parse(fieldValue);
                }
                method.invoke(object, date);
            }
        }
        if (type.equals("class java.lang.Integer")) {
            method = object.getClass().getMethod("set" + upperName,Integer.class);  
            method.invoke(object, Integer.parseInt(fieldValue));
        }
        if (type.equals("class java.lang.Long")) {
            method = object.getClass().getMethod("set" + upperName,Long.class);  
            method.invoke(object, Long.parseLong(fieldValue));
        }
        if (type.equals("class java.math.BigDecimal")) {
            method = object.getClass().getMethod("set" + upperName,BigDecimal.class);
            method.invoke(object, new BigDecimal(fieldValue));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

excel表格的解析,就半公共化了。

猜你喜欢

转载自blog.csdn.net/guowujun321/article/details/82970266