excl批量导入数据,后台公共解析方法

excl批量导入数据,后台共用解析方法,只要excl中的内容,能够对应到实体对象类中就可以用此方法。

简单例子可以点击这里,excl批量导入数据,后台使用java语言解析前台都是传递文件(这里只演示传递一个文件的情况),Java后台代码,

//这里因为每个实体对应的属性(也就是字段名不一致),所以要将此属性传递给方法,还有该实体对象,这里因为有一些特殊字符,我也是进行特殊处理,
/*
* 返回集合对象,所有导入功能调用此方法
* @param sheet,读取的sheet页
* @param ie,ie为ImportExcel
* @param listStr,是按顺序排序的的所有属性的name值(顺序同excl表格的字段)
* @param str,是需要截取的数据集合数组"-"
* @param t,为实体对象
* @return List<T>,实体集合
*/
public static <T> List<T> expFile(Sheet sheet,ImportExcel ie,String[] listStr,String[] str,T t){

    List<T> list_T = new ArrayList<T>();
    ie.setSheet(sheet);
    //1、得到总行数、总列数(ie.getHeaderNum())
    int rowNum = sheet.getLastRowNum();
    //2、从第三行开始读取数据
    if(listStr!=null && listStr.length>0){
        for(int i =2; i<rowNum; i++){
            try{
                Row row = sheet.getRow(i);
                T t2 = (T)t.getClass().newInstance();                
                for(int j=0; j<listStr.length; j++){
                    String ss = ie.getCellValue(row,j);
                    if(ss!=null && !"".equals(ss)){
                        if(isHaveN(listStr[j],str)){//true说明需要截取
                            t2 = SetTValue(t2,ss,listStr[j],"1");//需要截取“-”之前
                        }else{
                            t2 = SetTValue(t2,ss,listStr[j],"0");//t为当前对象,不需要截取                        
                        }
                    }
                }
                list_T.add(t2);
            }catch(Exception e){
                e.printStackTrace();
                continue;
            }
        }
    }
    return list_T;

}

//判断str是否在st数组中
public static Boolean isHaveN(String str,String[] st){
    try{
        for(String string :st){
            if(str!=null && string.equals(str)){
                return true;
            }
        }
    }catch(Exception e){
        return false;
    }
}


//给对象赋值,所有导入只需要传递相应参数,就可以赋值为对应属性
//t,为对象,str,要赋予的值,name 赋予的属性名,type是类型
public static <T> T SetTValue(T t,String str,String name,String type){
    SimpleDataFormat sFmat = new SimpleDataFormat("yyyy-MM-dd HH:mm:ss");
    Class<? extends Object> c = t.getClass();
//原先想法是,得到该对象的所有属性值,在进行一步判断,属性值是否存在,后续去掉了此判断
//Field[] field = t.getClass().getDeclaredFields();//该类所有属性值
//之后再for循环field去判断name是否跟其中的getName()相等;相等了进行赋值

    try{
        if("1".equqls(type)){
            str = formatDicparam(str);
        }
       Field[] field = c.getDeclaredFields();//该类所有属性值 
        field.setAccessible(true);
        String nameUf  = name.substring(0,1).toUpperCase()+name.substring(1);
        if(field.getGenericType().toString().equals("class java.lang.String")){
            Method md = t.getClass().getMethod("set"+nameUf,String.class);
            md.invoke(t,str);
        }else if(field.getGenericType().toString().equals("class java.lang.Integer")){
            Method md = t.getClass().getMethod("set"+nameUf,Integer.class);
            md.invoke(t,Integer.parseInt(str));
        }else if(field.getGenericType().toString().equals("class java.lang.Boolean")){
            Method md = t.getClass().getMethod("set"+nameUf,Boolean.class);
            md.invoke(t,Boolean.parseBoolean(str));//str为“true”时为true,其余为false
        }else if(field.getGenericType().toString().equals("class java.lang.BigDecimal")){
            Method md = t.getClass().getMethod("set"+nameUf,BigDecimal.class);
            md.invoke(t,new BigDecimal(str));
        }else if(field.getGenericType().toString().equals("class java.util.Date")){
            Method md = t.getClass().getMethod("set"+nameUf,Date.class);
            md.invoke(t,sFmat.parse(str));
        }else if(field.getGenericType().toString().equals("class java.lang.Short")){
            Method md = t.getClass().getMethod("set"+nameUf,Short.class);
            md.invoke(t,Short.parseShort(str));
        }else if(field.getGenericType().toString().equals("class java.lang.Long")){
            Method md = t.getClass().getMethod("set"+nameUf,Long.class);
            md.invoke(t,Long.parseLong(str));
        }else if(field.getGenericType().toString().equals("class java.lang.Byte")){
            Method md = t.getClass().getMethod("set"+nameUf,Byte.class);
            md.invoke(t,Byte.parseByte(str));
        }
    }catch(NoSuchFieldException | SercurityException e){
        log.error("属性不存在",name);
    }catch(Exception e){
        log.error("赋值出错",name);
    }

    return t;
}


public static String formatDicparam(Object cellValue){
    if(cellValue!=null && !"".equals(cellValue)){
        String str = cellValue.toString();
        if(str.indexOf("-")!=-1){
            return str.substring(0,str.indexOf("-"));
        }
        return str;
    }
    return "";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值