*.accdb数据文件的数据解析工具类

技术总结下:
1、使用jackcess来粗略读取*.accdb数据文件;
2、基于反射,将读取的粗粒数据进行解析。

不多说了,直接贴自己写的代码: 

public static <T> String parseAccdbToObject(Class<T> clazz, Table table) {
    
    // 校验数据
    if(null == table) {
        return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                "文件数据为空!").toJSONString();
    }
    Field[] fields = clazz.getDeclaredFields();
    T t = null;
    
    JSONArray ja = new JSONArray();
    JSONObject msg_jBean_accdbCBean = new JSONObject();
    
    for(Row model: table) {
        try {
            t = clazz.newInstance();
        } catch(InstantiationException e) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    "clazz参数对象异常" + clazz.getName() + "的实体类中没有【无参构造方法】").toJSONString();
        } catch (IllegalAccessException e) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    "clazz参数对象异常" + clazz.getName() + "的实体类中没有【无参构造方法】").toJSONString();
        }
        for (Field field : fields) {
            
            ExcelPropertyJade epj = field.getAnnotation(ExcelProperty.class);
            if(null == epj || !epj.isImport()) {
                // 排除部分不导入数据
                continue;
            }
            field.setAccessible(true);
            
            String fieldNameFinal = field.getName();
            String fieldName = fieldNameFinal.replaceFirst(fieldNameFinal.substring(0, 1), 
                    fieldNameFinal.substring(0, 1).toUpperCase());
            String propertyName = field.getAnnotation(ApiModelProperty.class).value();
            
            Class<?> beanType = field.getType();
            Method m = null;
            try {
                m = field.getDeclaringClass().getMethod("set"+fieldName, beanType);
            }catch(NoSuchMethodException e) {
                msg_jBean_accdbCBean.put(propertyName + "=&=" + fieldNameFinal, "该对象属性没有set方法");
                continue;
            }
            
            
            String beanTypeStr = String.valueOf(beanType);
            beanTypeStr = beanTypeStr.substring(beanTypeStr.lastIndexOf(".")+1);
            
            String tableColumnTypeStr = table.getColumn(propertyName).getType().name();
            // 返回数据映射时的错误信息
            JSONObject jo = JSONObject.parseObject(rejectValueToObjectByMapping(beanTypeStr, tableColumnTypeStr, model, propertyName, t, m));
            if(jo.isEmpty())
                continue;
            msg_jBean_accdbCBean.put(propertyName + "=&=" + fieldNameFinal, jo);
        }
        if(!msg_jBean_accdbCBean.isEmpty()) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, msg_jBean_accdbCBean).toJSONString();
        }
        if(null == t) {
            return new BaseReturn(BaseResultCode.ERROR_CODE_500, 
                    BaseResultCode.ERROR_MSG_500_PROCESS).toJSONString();
        }else {
            ja.add(t);
        }
    }
    return new BaseReturn(BaseResultCode.SUCCESS_MSG_200, ja).toJSONString("yyyy-MM-dd HH:mm:ss");
}

    /*
    * <b>类型过滤器:</b>
    * 已生成java对象和accdb数据文件中的【属性—字段】类型映射后,赋值给引用对象
    * @param beanTypeStr			(String)java属性
    * @param tableColumnTypeStr	(String)access中字段类型
    * @param enrollModel			access中的Row数据
    * @param propertyName			access中的Row数据的key
    * @param t						对象引用,读取后的数据通过引用赋给对象
    * @param m						对象的set方法
    * @return
    */
private static <T> String rejectValueToObjectByMapping(String beanTypeStr, String tableColumnTypeStr,
        Row model, String propertyName, T t, Method m) {
//		accessType:
            TEXT、DOUBLE、BOOLEAN、LONG
//		ZoneId zoneId = ZoneId.systemDefault();
    JSONObject msg_jBean_accdbCBean = new JSONObject();
    try {
        switch (beanTypeStr) {
        case "Double":	m.invoke(t, model.getDouble(propertyName)); break;
        case "Long":	m.invoke(t, Long.valueOf(model.getString(propertyName))); break;
        case "int":		m.invoke(t, model.getInt(propertyName)); break;
        case "String":	m.invoke(t, model.getString(propertyName)); break;
        case "boolean":	m.invoke(t, model.getBoolean(propertyName)); break;
        case "Date":
//    		ZonedDateTime zdt = enrollModel.getLocalDateTime(model.getString(propertyName)).atZone(zoneId);
//    		Date date = Date.from(zdt.toInstant());
            String dateStr = model.getString(propertyName);
            Date date = DateUtil.parseDatePlus(dateStr);
            m.invoke(t, date); 
            break;
        default : 
            msg_jBean_accdbCBean.put("error", "类型过滤器需要新增一个Javabean:" + beanTypeStr);
            break;
        }
    } catch (IllegalAccessException IllegalAccessE) {
        msg_jBean_accdbCBean.put("IllegalAccessException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (IllegalArgumentException IllegalArgumentE) {
        msg_jBean_accdbCBean.put("IllegalArgumentException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (InvocationTargetException InvocationTargetE) {
        msg_jBean_accdbCBean.put("InvocationTargetException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    } catch (ParseException IllegalAccessE) {
        msg_jBean_accdbCBean.put("ParseException", "时间解析异常;");
    } catch (ClassCastException ClassCastE) {
        msg_jBean_accdbCBean.put("ClassCastException", "Javabean异常。Javabean为:" + beanTypeStr + ",而AccdbCBean为:" + tableColumnTypeStr);
    }
    return msg_jBean_accdbCBean.toJSONString();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值