技术总结下:
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();
}