| @@ -167,5 +167,16 @@ public @interface Excel { | |||
| */ | |||
| public boolean isColumnHidden() default false; | |||
| /** | |||
| * 枚举导出使用的字段 | |||
| * @return | |||
| */ | |||
| public String enumExportField() default ""; | |||
| /** | |||
| * 枚举导入使用的函数 | |||
| * @return | |||
| */ | |||
| public String enumImportMethod() default ""; | |||
| } | |||
| @@ -161,4 +161,6 @@ public class ExcelBaseEntity { | |||
| public void setFixedIndex(Integer fixedIndex) { | |||
| this.fixedIndex = fixedIndex; | |||
| } | |||
| } | |||
| @@ -75,6 +75,10 @@ public class ExcelExportEntity extends ExcelBaseEntity implements Comparable<Exc | |||
| * 是否隐藏列 | |||
| */ | |||
| private boolean isColumnHidden; | |||
| /** | |||
| * 枚举导出属性字段 | |||
| */ | |||
| private String enumExportField; | |||
| public boolean isColumnHidden() { | |||
| return isColumnHidden; | |||
| @@ -209,6 +213,14 @@ public class ExcelExportEntity extends ExcelBaseEntity implements Comparable<Exc | |||
| this.numFormat = numFormat; | |||
| } | |||
| public String getEnumExportField() { | |||
| return enumExportField; | |||
| } | |||
| public void setEnumExportField(String enumExportField) { | |||
| this.enumExportField = enumExportField; | |||
| } | |||
| @Override | |||
| public int compareTo(ExcelExportEntity prev) { | |||
| return this.getOrderNum() - prev.getOrderNum(); | |||
| @@ -48,6 +48,11 @@ public class ExcelImportEntity extends ExcelBaseEntity { | |||
| */ | |||
| private boolean importField; | |||
| /** | |||
| * 枚举导入静态方法 | |||
| */ | |||
| private String enumImportMethod; | |||
| private List<ExcelImportEntity> list; | |||
| public String getClassType() { | |||
| @@ -106,4 +111,11 @@ public class ExcelImportEntity extends ExcelBaseEntity { | |||
| this.importField = importField; | |||
| } | |||
| public String getEnumImportMethod() { | |||
| return enumImportMethod; | |||
| } | |||
| public void setEnumImportMethod(String enumImportMethod) { | |||
| this.enumImportMethod = enumImportMethod; | |||
| } | |||
| } | |||
| @@ -403,7 +403,7 @@ public abstract class BaseExportService extends ExportCommonService { | |||
| if (excelParams.get(i).getList() != null) { | |||
| List<ExcelExportEntity> list = excelParams.get(i).getList(); | |||
| for (int j = 0; j < list.size(); j++) { | |||
| sheet.setColumnHidden(index,list.get(i).isColumnHidden()); | |||
| sheet.setColumnHidden(index,list.get(j).isColumnHidden()); | |||
| index++; | |||
| } | |||
| } else { | |||
| @@ -206,6 +206,9 @@ public class ExportCommonService { | |||
| if (StringUtils.isNotEmpty(entity.getSuffix()) && value != null) { | |||
| value = value + entity.getSuffix(); | |||
| } | |||
| if (value != null && StringUtils.isNotEmpty(entity.getEnumExportField())){ | |||
| value = PoiReflectorUtil.fromCache(value.getClass()).getValue(value,entity.getEnumExportField()); | |||
| } | |||
| return value == null ? "" : value.toString(); | |||
| } | |||
| @@ -249,6 +252,7 @@ public class ExportCommonService { | |||
| excelEntity.setNumFormat(excel.numFormat()); | |||
| excelEntity.setColumnHidden(excel.isColumnHidden()); | |||
| excelEntity.setDict(excel.dict()); | |||
| excelEntity.setEnumExportField(excel.enumExportField()); | |||
| if (excelGroup != null) { | |||
| excelEntity.setGroupName(PoiPublicUtil.getValueByTargetId(excelGroup.name(), targetId, null)); | |||
| } else { | |||
| @@ -28,6 +28,7 @@ import java.util.List; | |||
| import java.util.Map; | |||
| import cn.afterturn.easypoi.handler.inter.IExcelDictHandler; | |||
| import cn.afterturn.easypoi.util.PoiReflectorUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.apache.poi.ss.usermodel.Cell; | |||
| import org.apache.poi.ss.usermodel.CellType; | |||
| @@ -191,11 +192,13 @@ public class CellValueService { | |||
| String titleString, IExcelDictHandler dictHandler) throws Exception { | |||
| ExcelImportEntity entity = excelParams.get(titleString); | |||
| String xclass = "class java.lang.Object"; | |||
| Class clazz = null; | |||
| if (!(object instanceof Map)) { | |||
| Method setMethod = entity.getMethods() != null && entity.getMethods().size() > 0 | |||
| ? entity.getMethods().get(entity.getMethods().size() - 1) : entity.getMethod(); | |||
| Type[] ts = setMethod.getGenericParameterTypes(); | |||
| xclass = ts[0].toString(); | |||
| clazz = (Class) ts[0]; | |||
| } | |||
| Object result = getCellValue(xclass, cell, entity); | |||
| if (entity != null) { | |||
| @@ -207,7 +210,7 @@ public class CellValueService { | |||
| } | |||
| } | |||
| result = handlerValue(dataHandler, object, result, titleString); | |||
| return getValueByType(xclass, result, entity); | |||
| return getValueByType(xclass, result, entity, clazz); | |||
| } | |||
| /** | |||
| @@ -231,7 +234,7 @@ public class CellValueService { | |||
| result = hanlderSuffix(entity.getSuffix(), result); | |||
| result = replaceValue(entity.getReplace(), result); | |||
| result = handlerValue(dataHandler, object, result, titleString); | |||
| return getValueByType(xclass, result, entity); | |||
| return getValueByType(xclass, result, entity, (Class) ts[0]); | |||
| } | |||
| /** | |||
| @@ -255,9 +258,10 @@ public class CellValueService { | |||
| * @param xclass | |||
| * @param result | |||
| * @param entity | |||
| * @param clazz | |||
| * @return | |||
| */ | |||
| private Object getValueByType(String xclass, Object result, ExcelImportEntity entity) { | |||
| private Object getValueByType(String xclass, Object result, ExcelImportEntity entity, Class clazz) { | |||
| try { | |||
| //过滤空和空字符串,如果基本类型null会在上层抛出,这里就不处理了 | |||
| if (result == null || StringUtils.isBlank(result.toString())) { | |||
| @@ -305,6 +309,13 @@ public class CellValueService { | |||
| } | |||
| return String.valueOf(result); | |||
| } | |||
| if (clazz.isEnum()) { | |||
| if (StringUtils.isNotEmpty(entity.getEnumImportMethod())) { | |||
| return PoiReflectorUtil.fromCache(clazz).execEnumStaticMethod(entity.getEnumImportMethod(),result); | |||
| } else { | |||
| return Enum.valueOf(clazz,result.toString()); | |||
| } | |||
| } | |||
| return result; | |||
| } catch (Exception e) { | |||
| LOGGER.error(e.getMessage(), e); | |||
| @@ -77,7 +77,21 @@ public class ImportBaseService { | |||
| excelEntity.setImportField(Boolean | |||
| .valueOf(PoiPublicUtil.getValueByTargetId(excel.isImportField(), targetId, "false"))); | |||
| excelEntity.setFixedIndex(excel.fixedIndex()); | |||
| getExcelField(targetId, field, excelEntity, excel, pojoClass, excelEntityAnn); | |||
| excelEntity.setName(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| if (StringUtils.isNoneEmpty(excel.groupName())) { | |||
| excelEntity.setName(excel.groupName() + "_" + excelEntity.getName()); | |||
| } | |||
| if(excelEntityAnn != null && excelEntityAnn.show()){ | |||
| excelEntity.setName(excelEntityAnn.name() + "_" + excelEntity.getName()); | |||
| } | |||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getSetMethod(field.getName())); | |||
| if (StringUtils.isNotEmpty(excel.importFormat())) { | |||
| excelEntity.setFormat(excel.importFormat()); | |||
| } else { | |||
| excelEntity.setFormat(excel.format()); | |||
| } | |||
| excelEntity.setDict(excel.dict()); | |||
| excelEntity.setEnumImportMethod(excel.enumImportMethod()); | |||
| if (getMethods != null) { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| newMethods.addAll(getMethods); | |||
| @@ -128,7 +142,7 @@ public class ImportBaseService { | |||
| field.getAnnotation(ExcelCollection.class).name(), targetId, null)); | |||
| additionalCollectionName(collection); | |||
| excelCollection.add(collection); | |||
| } else if (PoiPublicUtil.isJavaClass(field)) { | |||
| } else if (PoiPublicUtil.isJavaClass(field) || field.getType().isEnum()) { | |||
| addEntityToMap(targetId, field, excelEntity, pojoClass, getMethods, excelParams, excelEntityAnn); | |||
| } else { | |||
| List<Method> newMethods = new ArrayList<Method>(); | |||
| @@ -162,24 +176,7 @@ public class ImportBaseService { | |||
| } | |||
| } | |||
| public void getExcelField(String targetId, Field field, ExcelImportEntity excelEntity, | |||
| Excel excel, Class<?> pojoClass, ExcelEntity excelEntityAnn) throws Exception { | |||
| excelEntity.setName(PoiPublicUtil.getValueByTargetId(excel.name(), targetId, null)); | |||
| if (StringUtils.isNoneEmpty(excel.groupName())) { | |||
| excelEntity.setName(excel.groupName() + "_" + excelEntity.getName()); | |||
| } | |||
| if(excelEntityAnn != null && excelEntityAnn.show()){ | |||
| excelEntity.setName(excelEntityAnn.name() + "_" + excelEntity.getName()); | |||
| } | |||
| String fieldname = field.getName(); | |||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getSetMethod(fieldname)); | |||
| if (StringUtils.isNotEmpty(excel.importFormat())) { | |||
| excelEntity.setFormat(excel.importFormat()); | |||
| } else { | |||
| excelEntity.setFormat(excel.format()); | |||
| } | |||
| excelEntity.setDict(excel.dict()); | |||
| } | |||
| public void getExcelFieldList(String targetId, Field[] fields, Class<?> pojoClass, | |||
| Map<String, ExcelImportEntity> temp, | |||
| @@ -105,7 +105,7 @@ public final class PoiPublicUtil { | |||
| ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | |||
| PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | |||
| collection.type().newInstance()); | |||
| } else if (!isJavaClass(field)) { | |||
| } else if (!isJavaClass(field) && !field.getType().isEnum()) { | |||
| PoiReflectorUtil.fromCache(clazz).setValue(obj, field.getName(), | |||
| createObject(field.getType(), targetId)); | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| package cn.afterturn.easypoi.util; | |||
| import java.lang.reflect.Field; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import java.lang.reflect.ReflectPermission; | |||
| import java.util.ArrayList; | |||
| @@ -14,20 +15,23 @@ import java.util.concurrent.ConcurrentHashMap; | |||
| /** | |||
| * 反射工具类,缓存读取的class信息,省的一直获取 | |||
| * @author JueYue | |||
| * 参考的 mybatis的Reflector | |||
| * | |||
| * @author JueYue | |||
| * 参考的 mybatis的Reflector | |||
| */ | |||
| public final class PoiReflectorUtil { | |||
| private static final Map<Class<?>, PoiReflectorUtil> CACHE_REFLECTOR = new ConcurrentHashMap<Class<?>, PoiReflectorUtil>(); | |||
| private Map<String, Method> getMethods = new HashMap<String, Method>(); | |||
| private Map<String, Method> setMethods = new HashMap<String, Method>(); | |||
| private List<Field> fieldList = new ArrayList<Field>(); | |||
| private Map<String, Method> getMethods = new HashMap<String, Method>(); | |||
| private Map<String, Method> setMethods = new HashMap<String, Method>(); | |||
| private Map<String, Method> enumMethods = new HashMap<String, Method>(); | |||
| private List<Field> fieldList = new ArrayList<Field>(); | |||
| private Class<?> type; | |||
| private Class<?> type; | |||
| private PoiReflectorUtil(Class<?> clazz) { | |||
| this.type = clazz; | |||
| addGetMethods(clazz); | |||
| addFields(clazz); | |||
| addSetMethods(clazz); | |||
| @@ -79,11 +83,11 @@ public final class PoiReflectorUtil { | |||
| Class<?> methodType = method.getReturnType(); | |||
| if (methodType.equals(getterType)) { | |||
| throw new RuntimeException( | |||
| "Illegal overloaded getter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| "Illegal overloaded getter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| } else if (methodType.isAssignableFrom(getterType)) { | |||
| // OK getter type is descendant | |||
| } else if (getterType.isAssignableFrom(methodType)) { | |||
| @@ -91,11 +95,11 @@ public final class PoiReflectorUtil { | |||
| getterType = methodType; | |||
| } else { | |||
| throw new RuntimeException( | |||
| "Illegal overloaded getter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| "Illegal overloaded getter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| } | |||
| } | |||
| addGetMethod(propName, getter); | |||
| @@ -131,7 +135,7 @@ public final class PoiReflectorUtil { | |||
| name = name.substring(3); | |||
| } else { | |||
| throw new RuntimeException("Error parsing property name '" + name | |||
| + "'. Didn't start with 'is', 'get' or 'set'."); | |||
| + "'. Didn't start with 'is', 'get' or 'set'."); | |||
| } | |||
| if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) { | |||
| @@ -169,11 +173,11 @@ public final class PoiReflectorUtil { | |||
| } | |||
| if (setter == null) { | |||
| throw new RuntimeException( | |||
| "Illegal overloaded setter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| "Illegal overloaded setter method with ambiguous type for property " | |||
| + propName + " in class " | |||
| + firstMethod.getDeclaringClass() | |||
| + ". This breaks the JavaBeans " | |||
| + "specification and can cause unpredicatble results."); | |||
| } | |||
| addSetMethod(propName, setter); | |||
| } | |||
| @@ -296,7 +300,7 @@ public final class PoiReflectorUtil { | |||
| Method method = getMethods.get(propertyName); | |||
| if (method == null) { | |||
| throw new RuntimeException( | |||
| "There is no getter for property named '" + propertyName + "' in '" + type + "'"); | |||
| "There is no getter for property named '" + propertyName + "' in '" + type + "'"); | |||
| } | |||
| return method; | |||
| } | |||
| @@ -305,13 +309,14 @@ public final class PoiReflectorUtil { | |||
| Method method = setMethods.get(propertyName); | |||
| if (method == null) { | |||
| throw new RuntimeException( | |||
| "There is no getter for property named '" + propertyName + "' in '" + type + "'"); | |||
| "There is no getter for property named '" + propertyName + "' in '" + type + "'"); | |||
| } | |||
| return method; | |||
| } | |||
| /** | |||
| * 获取field 值 | |||
| * | |||
| * @param obj | |||
| * @param property | |||
| * @return | |||
| @@ -321,7 +326,7 @@ public final class PoiReflectorUtil { | |||
| Method m = getMethods.get(property); | |||
| if (m != null) { | |||
| try { | |||
| value = m.invoke(obj, new Object[] {}); | |||
| value = m.invoke(obj, new Object[]{}); | |||
| } catch (Exception ex) { | |||
| } | |||
| } | |||
| @@ -330,9 +335,10 @@ public final class PoiReflectorUtil { | |||
| /** | |||
| * 设置field值 | |||
| * @param obj 对象 | |||
| * | |||
| * @param obj 对象 | |||
| * @param property | |||
| * @param object 属性值 | |||
| * @param object 属性值 | |||
| * @return | |||
| */ | |||
| public boolean setValue(Object obj, String property, Object object) { | |||
| @@ -356,4 +362,19 @@ public final class PoiReflectorUtil { | |||
| return fieldList; | |||
| } | |||
| public Object execEnumStaticMethod(String staticMethod, Object params) { | |||
| if (!enumMethods.containsKey(setMethods)) { | |||
| try { | |||
| enumMethods.put(staticMethod,type.getMethod(staticMethod,params.getClass())); | |||
| } catch (NoSuchMethodException e) { | |||
| throw new RuntimeException( | |||
| "There is no enum for property named '" + staticMethod + "' in '" + type + "'"); | |||
| } | |||
| } | |||
| try { | |||
| return enumMethods.get(staticMethod).invoke(null,params); | |||
| } catch (Exception e) { | |||
| throw new RuntimeException(e); | |||
| } | |||
| } | |||
| } | |||