| @@ -34,6 +34,7 @@ import org.jeecgframework.poi.excel.annotation.ExcelEntity; | |||||
| import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | import org.jeecgframework.poi.excel.entity.params.ExcelExportEntity; | ||||
| import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | import org.jeecgframework.poi.handler.inter.IExcelDataHandler; | ||||
| import org.jeecgframework.poi.util.PoiPublicUtil; | import org.jeecgframework.poi.util.PoiPublicUtil; | ||||
| import org.jeecgframework.poi.util.PoiReflectorUtil; | |||||
| /** | /** | ||||
| * 导出基础处理,不设计POI,只设计对象,保证复用性 | * 导出基础处理,不设计POI,只设计对象,保证复用性 | ||||
| @@ -122,7 +123,7 @@ public class ExportBase { | |||||
| excelEntity = new ExcelExportEntity(); | excelEntity = new ExcelExportEntity(); | ||||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | excelEntity.setName(getExcelName(excel.name(), targetId)); | ||||
| excelEntity.setOrderNum(getCellOrder(excel.orderNum(), targetId)); | excelEntity.setOrderNum(getCellOrder(excel.orderNum(), targetId)); | ||||
| excelEntity.setMethod(PoiPublicUtil.getMethod(field.getName(), pojoClass)); | |||||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||||
| excelEntity.setList(list); | excelEntity.setList(list); | ||||
| excelParams.add(excelEntity); | excelParams.add(excelEntity); | ||||
| } else { | } else { | ||||
| @@ -130,7 +131,7 @@ public class ExportBase { | |||||
| if (getMethods != null) { | if (getMethods != null) { | ||||
| newMethods.addAll(getMethods); | newMethods.addAll(getMethods); | ||||
| } | } | ||||
| newMethods.add(PoiPublicUtil.getMethod(field.getName(), pojoClass)); | |||||
| newMethods.add(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||||
| ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | ExcelEntity excel = field.getAnnotation(ExcelEntity.class); | ||||
| getAllExcelField(exclusions, StringUtils.isNotEmpty(excel.id()) ? excel.id() | getAllExcelField(exclusions, StringUtils.isNotEmpty(excel.id()) ? excel.id() | ||||
| : targetId, PoiPublicUtil.getClassFields(field.getType()), excelParams, | : targetId, PoiPublicUtil.getClassFields(field.getType()), excelParams, | ||||
| @@ -237,8 +238,7 @@ public class ExportBase { | |||||
| : excel.format()); | : excel.format()); | ||||
| excelEntity.setStatistics(excel.isStatistics()); | excelEntity.setStatistics(excel.isStatistics()); | ||||
| excelEntity.setHyperlink(excel.isHyperlink()); | excelEntity.setHyperlink(excel.isHyperlink()); | ||||
| String fieldname = field.getName(); | |||||
| excelEntity.setMethod(PoiPublicUtil.getMethod(fieldname, pojoClass)); | |||||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -55,6 +55,7 @@ import org.jeecgframework.poi.excel.imports.verifys.VerifyHandlerServer; | |||||
| import org.jeecgframework.poi.exception.excel.ExcelImportException; | import org.jeecgframework.poi.exception.excel.ExcelImportException; | ||||
| import org.jeecgframework.poi.exception.excel.enums.ExcelImportEnum; | import org.jeecgframework.poi.exception.excel.enums.ExcelImportEnum; | ||||
| import org.jeecgframework.poi.util.PoiPublicUtil; | import org.jeecgframework.poi.util.PoiPublicUtil; | ||||
| import org.jeecgframework.poi.util.PoiReflectorUtil; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -100,8 +101,7 @@ public class ExcelImportServer extends ImportBaseService { | |||||
| Map<Integer, String> titlemap, String targetId, | Map<Integer, String> titlemap, String targetId, | ||||
| Map<String, PictureData> pictures, ImportParams params) | Map<String, PictureData> pictures, ImportParams params) | ||||
| throws Exception { | throws Exception { | ||||
| Collection collection = (Collection) PoiPublicUtil.getMethod(param.getName(), | |||||
| object.getClass()).invoke(object, new Object[] {}); | |||||
| Collection collection = (Collection) PoiReflectorUtil.fromCache(object.getClass()).getValue(object, param.getName()); | |||||
| Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | ||||
| String picId; | String picId; | ||||
| boolean isUsed = false;// 是否需要加上这个对象 | boolean isUsed = false;// 是否需要加上这个对象 | ||||
| @@ -39,6 +39,7 @@ import org.jeecgframework.poi.excel.entity.params.ExcelCollectionParams; | |||||
| import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | import org.jeecgframework.poi.excel.entity.params.ExcelImportEntity; | ||||
| import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity; | import org.jeecgframework.poi.excel.entity.params.ExcelVerifyEntity; | ||||
| import org.jeecgframework.poi.util.PoiPublicUtil; | import org.jeecgframework.poi.util.PoiPublicUtil; | ||||
| import org.jeecgframework.poi.util.PoiReflectorUtil; | |||||
| /** | /** | ||||
| * 导入基础和,普通方法和Sax共用 | * 导入基础和,普通方法和Sax共用 | ||||
| @@ -146,7 +147,7 @@ public class ImportBaseService { | |||||
| if (getMethods != null) { | if (getMethods != null) { | ||||
| newMethods.addAll(getMethods); | newMethods.addAll(getMethods); | ||||
| } | } | ||||
| newMethods.add(PoiPublicUtil.getMethod(field.getName(), pojoClass)); | |||||
| newMethods.add(PoiReflectorUtil.fromCache(pojoClass).getGetMethod(field.getName())); | |||||
| getAllExcelField(targetId, PoiPublicUtil.getClassFields(field.getType()), | getAllExcelField(targetId, PoiPublicUtil.getClassFields(field.getType()), | ||||
| excelParams, excelCollection, field.getType(), newMethods); | excelParams, excelCollection, field.getType(), newMethods); | ||||
| } | } | ||||
| @@ -171,7 +172,7 @@ public class ImportBaseService { | |||||
| Excel excel, Class<?> pojoClass) throws Exception { | Excel excel, Class<?> pojoClass) throws Exception { | ||||
| excelEntity.setName(getExcelName(excel.name(), targetId)); | excelEntity.setName(getExcelName(excel.name(), targetId)); | ||||
| String fieldname = field.getName(); | String fieldname = field.getName(); | ||||
| excelEntity.setMethod(PoiPublicUtil.getMethod(fieldname, pojoClass, field.getType())); | |||||
| excelEntity.setMethod(PoiReflectorUtil.fromCache(pojoClass).getSetMethod(fieldname)); | |||||
| if (StringUtils.isNotEmpty(excel.importFormat())) { | if (StringUtils.isNotEmpty(excel.importFormat())) { | ||||
| excelEntity.setFormat(excel.importFormat()); | excelEntity.setFormat(excel.importFormat()); | ||||
| } else { | } else { | ||||
| @@ -196,7 +197,7 @@ public class ImportBaseService { | |||||
| newMethods.addAll(getMethods); | newMethods.addAll(getMethods); | ||||
| } | } | ||||
| newMethods | newMethods | ||||
| .add(PoiPublicUtil.getMethod(field.getName(), pojoClass, field.getType())); | |||||
| .add(PoiReflectorUtil.fromCache(pojoClass).getSetMethod(field.getName())); | |||||
| getExcelFieldList(targetId, PoiPublicUtil.getClassFields(field.getType()), | getExcelFieldList(targetId, PoiPublicUtil.getClassFields(field.getType()), | ||||
| field.getType(), temp, newMethods); | field.getType(), temp, newMethods); | ||||
| } | } | ||||
| @@ -33,6 +33,7 @@ import org.jeecgframework.poi.excel.imports.base.ImportBaseService; | |||||
| import org.jeecgframework.poi.exception.excel.ExcelImportException; | import org.jeecgframework.poi.exception.excel.ExcelImportException; | ||||
| import org.jeecgframework.poi.handler.inter.IExcelReadRowHanlder; | import org.jeecgframework.poi.handler.inter.IExcelReadRowHanlder; | ||||
| import org.jeecgframework.poi.util.PoiPublicUtil; | import org.jeecgframework.poi.util.PoiPublicUtil; | ||||
| import org.jeecgframework.poi.util.PoiReflectorUtil; | |||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -170,8 +171,7 @@ public class SaxRowRead extends ImportBaseService implements ISaxRowRead { | |||||
| private void addListContinue(Object object, ExcelCollectionParams param, | private void addListContinue(Object object, ExcelCollectionParams param, | ||||
| List<SaxReadCellEntity> datas, Map<Integer, String> titlemap, | List<SaxReadCellEntity> datas, Map<Integer, String> titlemap, | ||||
| String targetId, ImportParams params) throws Exception { | String targetId, ImportParams params) throws Exception { | ||||
| Collection collection = (Collection) PoiPublicUtil.getMethod(param.getName(), | |||||
| object.getClass()).invoke(object, new Object[] {}); | |||||
| Collection collection = (Collection) PoiReflectorUtil.fromCache(pojoClass).getValue(object, param.getName()); | |||||
| Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | Object entity = PoiPublicUtil.createObject(param.getType(), targetId); | ||||
| boolean isUsed = false;// 是否需要加上这个对象 | boolean isUsed = false;// 是否需要加上这个对象 | ||||
| for (int i = 0; i < datas.size(); i++) { | for (int i = 0; i < datas.size(); i++) { | ||||
| @@ -15,6 +15,8 @@ | |||||
| */ | */ | ||||
| package org.jeecgframework.poi.util; | package org.jeecgframework.poi.util; | ||||
| import static org.jeecgframework.poi.util.PoiElUtil.*; | |||||
| import java.awt.image.BufferedImage; | import java.awt.image.BufferedImage; | ||||
| import java.io.ByteArrayOutputStream; | import java.io.ByteArrayOutputStream; | ||||
| import java.io.File; | import java.io.File; | ||||
| @@ -49,7 +51,6 @@ import org.jeecgframework.poi.excel.annotation.Excel; | |||||
| import org.jeecgframework.poi.excel.annotation.ExcelCollection; | import org.jeecgframework.poi.excel.annotation.ExcelCollection; | ||||
| import org.jeecgframework.poi.excel.annotation.ExcelEntity; | import org.jeecgframework.poi.excel.annotation.ExcelEntity; | ||||
| import org.jeecgframework.poi.excel.annotation.ExcelIgnore; | import org.jeecgframework.poi.excel.annotation.ExcelIgnore; | ||||
| import org.jeecgframework.poi.excel.entity.vo.PoiBaseConstants; | |||||
| import org.jeecgframework.poi.word.entity.WordImageEntity; | import org.jeecgframework.poi.word.entity.WordImageEntity; | ||||
| import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | import org.jeecgframework.poi.word.entity.params.ExcelListEntity; | ||||
| import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; | import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker; | ||||
| @@ -86,7 +87,6 @@ public final class PoiPublicUtil { | |||||
| */ | */ | ||||
| public static Object createObject(Class<?> clazz, String targetId) { | public static Object createObject(Class<?> clazz, String targetId) { | ||||
| Object obj = null; | Object obj = null; | ||||
| Method setMethod; | |||||
| try { | try { | ||||
| if (clazz.equals(Map.class)) { | if (clazz.equals(Map.class)) { | ||||
| return new HashMap<String, Object>(); | return new HashMap<String, Object>(); | ||||
| @@ -99,11 +99,9 @@ public final class PoiPublicUtil { | |||||
| } | } | ||||
| if (isCollection(field.getType())) { | if (isCollection(field.getType())) { | ||||
| ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | ExcelCollection collection = field.getAnnotation(ExcelCollection.class); | ||||
| setMethod = getMethod(field.getName(), clazz, field.getType()); | |||||
| setMethod.invoke(obj, collection.type().newInstance()); | |||||
| PoiReflectorUtil.fromCache(clazz).setValue(obj , field.getName(), collection.type().newInstance()); | |||||
| } else if (!isJavaClass(field)) { | } else if (!isJavaClass(field)) { | ||||
| setMethod = getMethod(field.getName(), clazz, field.getType()); | |||||
| setMethod.invoke(obj, createObject(field.getType(), targetId)); | |||||
| PoiReflectorUtil.fromCache(clazz).setValue(obj , field.getName(), createObject(field.getType(), targetId)); | |||||
| } | } | ||||
| } | } | ||||
| @@ -155,45 +153,6 @@ public final class PoiPublicUtil { | |||||
| return strFileExtendName; | return strFileExtendName; | ||||
| } | } | ||||
| /** | |||||
| * 获取GET方法 | |||||
| * | |||||
| * @param name | |||||
| * @param pojoClass | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| public static Method getMethod(String name, Class<?> pojoClass) throws Exception { | |||||
| StringBuffer getMethodName = new StringBuffer(PoiBaseConstants.GET); | |||||
| getMethodName.append(name.substring(0, 1).toUpperCase()); | |||||
| getMethodName.append(name.substring(1)); | |||||
| Method method = null; | |||||
| try { | |||||
| method = pojoClass.getMethod(getMethodName.toString(), new Class[] {}); | |||||
| } catch (Exception e) { | |||||
| method = pojoClass.getMethod( | |||||
| getMethodName.toString().replace(PoiBaseConstants.GET, PoiBaseConstants.IS), | |||||
| new Class[] {}); | |||||
| } | |||||
| return method; | |||||
| } | |||||
| /** | |||||
| * 获取SET方法 | |||||
| * | |||||
| * @param name | |||||
| * @param pojoClass | |||||
| * @param type | |||||
| * @return | |||||
| * @throws Exception | |||||
| */ | |||||
| public static Method getMethod(String name, Class<?> pojoClass, Class<?> type) throws Exception { | |||||
| StringBuffer getMethodName = new StringBuffer(PoiBaseConstants.SET); | |||||
| getMethodName.append(name.substring(0, 1).toUpperCase()); | |||||
| getMethodName.append(name.substring(1)); | |||||
| return pojoClass.getMethod(getMethodName.toString(), new Class[] { type }); | |||||
| } | |||||
| /** | /** | ||||
| * 获取Excel2003图片 | * 获取Excel2003图片 | ||||
| * | * | ||||
| @@ -406,7 +365,7 @@ public final class PoiPublicUtil { | |||||
| if (object instanceof Map) { | if (object instanceof Map) { | ||||
| return ((Map) object).get(params); | return ((Map) object).get(params); | ||||
| } | } | ||||
| return getMethod(params, object.getClass()).invoke(object, new Object[] {}); | |||||
| return PoiReflectorUtil.fromCache(object.getClass()).getValue(object, params); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -418,17 +377,17 @@ public final class PoiPublicUtil { | |||||
| */ | */ | ||||
| public static Object getRealValue(String currentText, Map<String, Object> map) throws Exception { | public static Object getRealValue(String currentText, Map<String, Object> map) throws Exception { | ||||
| String params = ""; | String params = ""; | ||||
| while (currentText.indexOf("{{") != -1) { | |||||
| while (currentText.indexOf(START_STR) != -1) { | |||||
| params = currentText | params = currentText | ||||
| .substring(currentText.indexOf("{{") + 2, currentText.indexOf("}}")); | |||||
| Object obj = getParamsValue(params.trim(), map); | |||||
| .substring(currentText.indexOf(START_STR) + 2, currentText.indexOf(END_STR)); | |||||
| Object obj = PoiElUtil.eval(params.trim(), map); | |||||
| //判断图片或者是集合 | //判断图片或者是集合 | ||||
| if (obj instanceof WordImageEntity || obj instanceof List | if (obj instanceof WordImageEntity || obj instanceof List | ||||
| || obj instanceof ExcelListEntity) { | || obj instanceof ExcelListEntity) { | ||||
| return obj; | return obj; | ||||
| } else { | } else { | ||||
| currentText = currentText.replace("{{" + params + "}}", obj.toString()); | |||||
| currentText = currentText.replace(START_STR + params + END_STR, obj.toString()); | |||||
| } | } | ||||
| } | } | ||||
| return currentText; | return currentText; | ||||
| @@ -455,7 +414,7 @@ public final class PoiPublicUtil { | |||||
| if (object instanceof Map) { | if (object instanceof Map) { | ||||
| object = ((Map) object).get(paramsArr[index]); | object = ((Map) object).get(paramsArr[index]); | ||||
| } else { | } else { | ||||
| object = getMethod(paramsArr[index], object.getClass()).invoke(object, new Object[] {}); | |||||
| object = PoiReflectorUtil.fromCache(object.getClass()).getValue(object, paramsArr[index]); | |||||
| } | } | ||||
| return (index == paramsArr.length - 1) ? (object == null ? "" : object) : getValueDoWhile( | return (index == paramsArr.length - 1) ? (object == null ? "" : object) : getValueDoWhile( | ||||
| object, paramsArr, ++index); | object, paramsArr, ++index); | ||||
| @@ -0,0 +1,356 @@ | |||||
| package org.jeecgframework.poi.util; | |||||
| import java.lang.reflect.Field; | |||||
| import java.lang.reflect.Method; | |||||
| import java.lang.reflect.ReflectPermission; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Collection; | |||||
| import java.util.HashMap; | |||||
| import java.util.Iterator; | |||||
| import java.util.List; | |||||
| import java.util.Locale; | |||||
| import java.util.Map; | |||||
| import java.util.concurrent.ConcurrentHashMap; | |||||
| /** | |||||
| * 反射工具类,缓存读取的class信息,省的一直获取 | |||||
| * @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 Class<?> type; | |||||
| private PoiReflectorUtil(Class<?> clazz) { | |||||
| addGetMethods(clazz); | |||||
| addFields(clazz); | |||||
| addSetMethods(clazz); | |||||
| } | |||||
| public static PoiReflectorUtil forClass(Class<?> clazz) { | |||||
| return new PoiReflectorUtil(clazz); | |||||
| } | |||||
| public static PoiReflectorUtil fromCache(Class<?> clazz) { | |||||
| if (!CACHE_REFLECTOR.containsKey(clazz)) { | |||||
| CACHE_REFLECTOR.put(clazz, new PoiReflectorUtil(clazz)); | |||||
| } | |||||
| return CACHE_REFLECTOR.get(clazz); | |||||
| } | |||||
| private void addGetMethods(Class<?> cls) { | |||||
| Map<String, List<Method>> conflictingGetters = new HashMap<String, List<Method>>(); | |||||
| Method[] methods = getClassMethods(cls); | |||||
| for (Method method : methods) { | |||||
| String name = method.getName(); | |||||
| if (name.startsWith("get") && name.length() > 3) { | |||||
| if (method.getParameterTypes().length == 0) { | |||||
| name = methodToProperty(name); | |||||
| addMethodConflict(conflictingGetters, name, method); | |||||
| } | |||||
| } else if (name.startsWith("is") && name.length() > 2) { | |||||
| if (method.getParameterTypes().length == 0) { | |||||
| name = methodToProperty(name); | |||||
| addMethodConflict(conflictingGetters, name, method); | |||||
| } | |||||
| } | |||||
| } | |||||
| resolveGetterConflicts(conflictingGetters); | |||||
| } | |||||
| private void resolveGetterConflicts(Map<String, List<Method>> conflictingGetters) { | |||||
| for (String propName : conflictingGetters.keySet()) { | |||||
| List<Method> getters = conflictingGetters.get(propName); | |||||
| Iterator<Method> iterator = getters.iterator(); | |||||
| Method firstMethod = iterator.next(); | |||||
| if (getters.size() == 1) { | |||||
| addGetMethod(propName, firstMethod); | |||||
| } else { | |||||
| Method getter = firstMethod; | |||||
| Class<?> getterType = firstMethod.getReturnType(); | |||||
| while (iterator.hasNext()) { | |||||
| Method method = iterator.next(); | |||||
| 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."); | |||||
| } else if (methodType.isAssignableFrom(getterType)) { | |||||
| // OK getter type is descendant | |||||
| } else if (getterType.isAssignableFrom(methodType)) { | |||||
| getter = method; | |||||
| 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."); | |||||
| } | |||||
| } | |||||
| addGetMethod(propName, getter); | |||||
| } | |||||
| } | |||||
| } | |||||
| private void addGetMethod(String name, Method method) { | |||||
| if (isValidPropertyName(name)) { | |||||
| getMethods.put(name, method); | |||||
| } | |||||
| } | |||||
| private void addSetMethods(Class<?> cls) { | |||||
| Map<String, List<Method>> conflictingSetters = new HashMap<String, List<Method>>(); | |||||
| Method[] methods = getClassMethods(cls); | |||||
| for (Method method : methods) { | |||||
| String name = method.getName(); | |||||
| if (name.startsWith("set") && name.length() > 3) { | |||||
| if (method.getParameterTypes().length == 1) { | |||||
| name = methodToProperty(name); | |||||
| addMethodConflict(conflictingSetters, name, method); | |||||
| } | |||||
| } | |||||
| } | |||||
| resolveSetterConflicts(conflictingSetters); | |||||
| } | |||||
| private static String methodToProperty(String name) { | |||||
| if (name.startsWith("is")) { | |||||
| name = name.substring(2); | |||||
| } else if (name.startsWith("get") || name.startsWith("set")) { | |||||
| name = name.substring(3); | |||||
| } else { | |||||
| throw new RuntimeException("Error parsing property name '" + name | |||||
| + "'. Didn't start with 'is', 'get' or 'set'."); | |||||
| } | |||||
| if (name.length() == 1 || (name.length() > 1 && !Character.isUpperCase(name.charAt(1)))) { | |||||
| name = name.substring(0, 1).toLowerCase(Locale.ENGLISH) + name.substring(1); | |||||
| } | |||||
| return name; | |||||
| } | |||||
| private void addMethodConflict(Map<String, List<Method>> conflictingMethods, String name, | |||||
| Method method) { | |||||
| List<Method> list = conflictingMethods.get(name); | |||||
| if (list == null) { | |||||
| list = new ArrayList<Method>(); | |||||
| conflictingMethods.put(name, list); | |||||
| } | |||||
| list.add(method); | |||||
| } | |||||
| private void resolveSetterConflicts(Map<String, List<Method>> conflictingSetters) { | |||||
| for (String propName : conflictingSetters.keySet()) { | |||||
| List<Method> setters = conflictingSetters.get(propName); | |||||
| Method firstMethod = setters.get(0); | |||||
| if (setters.size() == 1) { | |||||
| addSetMethod(propName, firstMethod); | |||||
| } else { | |||||
| Iterator<Method> methods = setters.iterator(); | |||||
| Method setter = null; | |||||
| while (methods.hasNext()) { | |||||
| Method method = methods.next(); | |||||
| if (method.getParameterTypes().length == 1) { | |||||
| setter = method; | |||||
| break; | |||||
| } | |||||
| } | |||||
| 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."); | |||||
| } | |||||
| addSetMethod(propName, setter); | |||||
| } | |||||
| } | |||||
| } | |||||
| private void addSetMethod(String name, Method method) { | |||||
| if (isValidPropertyName(name)) { | |||||
| setMethods.put(name, method); | |||||
| } | |||||
| } | |||||
| private void addFields(Class<?> clazz) { | |||||
| Field[] fields = clazz.getDeclaredFields(); | |||||
| for (Field field : fields) { | |||||
| if (canAccessPrivateMethods()) { | |||||
| try { | |||||
| field.setAccessible(true); | |||||
| } catch (Exception e) { | |||||
| // Ignored. This is only a final precaution, nothing we can do. | |||||
| } | |||||
| } | |||||
| if (field.isAccessible() && !field.getName().equalsIgnoreCase("serialVersionUID")) { | |||||
| this.fieldList.add(field); | |||||
| } | |||||
| } | |||||
| if (clazz.getSuperclass() != null) { | |||||
| addFields(clazz.getSuperclass()); | |||||
| } | |||||
| } | |||||
| private boolean isValidPropertyName(String name) { | |||||
| return !(name.startsWith("$") || "serialVersionUID".equals(name) || "class".equals(name)); | |||||
| } | |||||
| /* | |||||
| * This method returns an array containing all methods | |||||
| * declared in this class and any superclass. | |||||
| * We use this method, instead of the simpler Class.getMethods(), | |||||
| * because we want to look for private methods as well. | |||||
| * | |||||
| * @param cls The class | |||||
| * @return An array containing all methods in this class | |||||
| */ | |||||
| private Method[] getClassMethods(Class<?> cls) { | |||||
| HashMap<String, Method> uniqueMethods = new HashMap<String, Method>(); | |||||
| Class<?> currentClass = cls; | |||||
| while (currentClass != null) { | |||||
| addUniqueMethods(uniqueMethods, currentClass.getDeclaredMethods()); | |||||
| // we also need to look for interface methods - | |||||
| // because the class may be abstract | |||||
| Class<?>[] interfaces = currentClass.getInterfaces(); | |||||
| for (Class<?> anInterface : interfaces) { | |||||
| addUniqueMethods(uniqueMethods, anInterface.getMethods()); | |||||
| } | |||||
| currentClass = currentClass.getSuperclass(); | |||||
| } | |||||
| Collection<Method> methods = uniqueMethods.values(); | |||||
| return methods.toArray(new Method[methods.size()]); | |||||
| } | |||||
| private void addUniqueMethods(HashMap<String, Method> uniqueMethods, Method[] methods) { | |||||
| for (Method currentMethod : methods) { | |||||
| if (!currentMethod.isBridge()) { | |||||
| String signature = getSignature(currentMethod); | |||||
| // check to see if the method is already known | |||||
| // if it is known, then an extended class must have | |||||
| // overridden a method | |||||
| if (!uniqueMethods.containsKey(signature)) { | |||||
| if (canAccessPrivateMethods()) { | |||||
| try { | |||||
| currentMethod.setAccessible(true); | |||||
| } catch (Exception e) { | |||||
| // Ignored. This is only a final precaution, nothing we can do. | |||||
| } | |||||
| } | |||||
| uniqueMethods.put(signature, currentMethod); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| private String getSignature(Method method) { | |||||
| StringBuilder sb = new StringBuilder(); | |||||
| Class<?> returnType = method.getReturnType(); | |||||
| if (returnType != null) { | |||||
| sb.append(returnType.getName()).append('#'); | |||||
| } | |||||
| sb.append(method.getName()); | |||||
| Class<?>[] parameters = method.getParameterTypes(); | |||||
| for (int i = 0; i < parameters.length; i++) { | |||||
| if (i == 0) { | |||||
| sb.append(':'); | |||||
| } else { | |||||
| sb.append(','); | |||||
| } | |||||
| sb.append(parameters[i].getName()); | |||||
| } | |||||
| return sb.toString(); | |||||
| } | |||||
| private boolean canAccessPrivateMethods() { | |||||
| try { | |||||
| SecurityManager securityManager = System.getSecurityManager(); | |||||
| if (null != securityManager) { | |||||
| securityManager.checkPermission(new ReflectPermission("suppressAccessChecks")); | |||||
| } | |||||
| } catch (SecurityException e) { | |||||
| return false; | |||||
| } | |||||
| return true; | |||||
| } | |||||
| public Method getGetMethod(String propertyName) { | |||||
| Method method = getMethods.get(propertyName); | |||||
| if (method == null) { | |||||
| throw new RuntimeException("There is no getter for property named '" + propertyName | |||||
| + "' in '" + type + "'"); | |||||
| } | |||||
| return method; | |||||
| } | |||||
| public Method getSetMethod(String propertyName) { | |||||
| Method method = setMethods.get(propertyName); | |||||
| if (method == null) { | |||||
| throw new RuntimeException("There is no getter for property named '" + propertyName | |||||
| + "' in '" + type + "'"); | |||||
| } | |||||
| return method; | |||||
| } | |||||
| /** | |||||
| * 获取field 值 | |||||
| * @param obj | |||||
| * @param property | |||||
| * @return | |||||
| */ | |||||
| public Object getValue(Object obj, String property) { | |||||
| Object value = null; | |||||
| Method m = getMethods.get(property); | |||||
| if (m != null) { | |||||
| try { | |||||
| value = m.invoke(obj, new Object[] {}); | |||||
| } catch (Exception ex) { | |||||
| } | |||||
| } | |||||
| return value; | |||||
| } | |||||
| /** | |||||
| * 设置field值 | |||||
| * @param obj 对象 | |||||
| * @param property | |||||
| * @param object 属性值 | |||||
| * @return | |||||
| */ | |||||
| public boolean setValue(Object obj, String property, Object object) { | |||||
| Method m = setMethods.get(property); | |||||
| if (m != null) { | |||||
| try { | |||||
| m.invoke(obj, object); | |||||
| return true; | |||||
| } catch (Exception ex) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return false; | |||||
| } | |||||
| public Map<String, Method> getGetMethods() { | |||||
| return getMethods; | |||||
| } | |||||
| public List<Field> getFieldList() { | |||||
| return fieldList; | |||||
| } | |||||
| } | |||||
| @@ -15,7 +15,10 @@ | |||||
| */ | */ | ||||
| package org.jeecgframework.poi.word.parse; | package org.jeecgframework.poi.word.parse; | ||||
| import static org.jeecgframework.poi.util.PoiElUtil.*; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Collection; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| @@ -64,15 +67,15 @@ public class ParseWord07 { | |||||
| Object[] isAndType = PoiPublicUtil.getIsAndType(obj); | Object[] isAndType = PoiPublicUtil.getIsAndType(obj); | ||||
| String picId; | String picId; | ||||
| try { | try { | ||||
| picId = currentRun.getParagraph().getDocument() | |||||
| .addPictureData((byte[]) isAndType[0], (Integer) isAndType[1]); | |||||
| picId = currentRun.getParagraph().getDocument().addPictureData((byte[]) isAndType[0], | |||||
| (Integer) isAndType[1]); | |||||
| ((MyXWPFDocument) currentRun.getParagraph().getDocument()).createPicture(currentRun, | ((MyXWPFDocument) currentRun.getParagraph().getDocument()).createPicture(currentRun, | ||||
| picId, | |||||
| currentRun.getParagraph().getDocument() | |||||
| .getNextPicNameNumber((Integer) isAndType[1]), obj.getWidth(), obj.getHeight()); | |||||
| picId, currentRun.getParagraph().getDocument() | |||||
| .getNextPicNameNumber((Integer) isAndType[1]), | |||||
| obj.getWidth(), obj.getHeight()); | |||||
| } catch (Exception e) { | } catch (Exception e) { | ||||
| LOGGER.error(e.getMessage(),e); | |||||
| LOGGER.error(e.getMessage(), e); | |||||
| } | } | ||||
| } | } | ||||
| @@ -108,12 +111,15 @@ public class ParseWord07 { | |||||
| * @return | * @return | ||||
| * @throws Exception | * @throws Exception | ||||
| */ | */ | ||||
| private Object checkThisTableIsNeedIterator(XWPFTableCell cell, Map<String, Object> map) | |||||
| throws Exception { | |||||
| private Object checkThisTableIsNeedIterator(XWPFTableCell cell, | |||||
| Map<String, Object> map) throws Exception { | |||||
| String text = cell.getText().trim(); | String text = cell.getText().trim(); | ||||
| // 判断是不是迭代输出 | // 判断是不是迭代输出 | ||||
| if (text.startsWith("{{") && text.endsWith("}}") && text.indexOf("in ") != -1) { | |||||
| return PoiPublicUtil.getRealValue(text.replace("in ", "").trim(), map); | |||||
| if (text != null && text.contains(FOREACH) && text.startsWith(START_STR)) { | |||||
| text = text.replace(FOREACH_NOT_CREATE, EMPTY).replace(FOREACH_AND_SHIFT, EMPTY) | |||||
| .replace(FOREACH, EMPTY).replace(START_STR, EMPTY); | |||||
| String[] keys = text.replaceAll("\\s{1,}", " ").trim().split(" "); | |||||
| return (Collection<?>) PoiPublicUtil.getParamsValue(keys[0], map); | |||||
| } | } | ||||
| return null; | return null; | ||||
| } | } | ||||
| @@ -126,12 +132,12 @@ public class ParseWord07 { | |||||
| * @param paragraphs | * @param paragraphs | ||||
| * @param map | * @param map | ||||
| */ | */ | ||||
| private void parseAllParagraphic(List<XWPFParagraph> paragraphs, Map<String, Object> map) | |||||
| throws Exception { | |||||
| private void parseAllParagraphic(List<XWPFParagraph> paragraphs, | |||||
| Map<String, Object> map) throws Exception { | |||||
| XWPFParagraph paragraph; | XWPFParagraph paragraph; | ||||
| for (int i = 0; i < paragraphs.size(); i++) { | for (int i = 0; i < paragraphs.size(); i++) { | ||||
| paragraph = paragraphs.get(i); | paragraph = paragraphs.get(i); | ||||
| if (paragraph.getText().indexOf("{{") != -1) { | |||||
| if (paragraph.getText().indexOf(START_STR) != -1) { | |||||
| parseThisParagraph(paragraph, map); | parseThisParagraph(paragraph, map); | ||||
| } | } | ||||
| @@ -147,8 +153,8 @@ public class ParseWord07 { | |||||
| * @param paragraph | * @param paragraph | ||||
| * @param map | * @param map | ||||
| */ | */ | ||||
| private void parseThisParagraph(XWPFParagraph paragraph, Map<String, Object> map) | |||||
| throws Exception { | |||||
| private void parseThisParagraph(XWPFParagraph paragraph, | |||||
| Map<String, Object> map) throws Exception { | |||||
| XWPFRun run; | XWPFRun run; | ||||
| XWPFRun currentRun = null;// 拿到的第一个run,用来set值,可以保存格式 | XWPFRun currentRun = null;// 拿到的第一个run,用来set值,可以保存格式 | ||||
| String currentText = "";// 存放当前的text | String currentText = "";// 存放当前的text | ||||
| @@ -160,28 +166,28 @@ public class ParseWord07 { | |||||
| text = run.getText(0); | text = run.getText(0); | ||||
| if (StringUtils.isEmpty(text)) { | if (StringUtils.isEmpty(text)) { | ||||
| continue; | continue; | ||||
| }// 如果为空或者""这种这继续循环跳过 | |||||
| } // 如果为空或者""这种这继续循环跳过 | |||||
| if (isfinde) { | if (isfinde) { | ||||
| currentText += text; | currentText += text; | ||||
| if (currentText.indexOf("{{") == -1) { | |||||
| if (currentText.indexOf(START_STR) == -1) { | |||||
| isfinde = false; | isfinde = false; | ||||
| runIndex.clear(); | runIndex.clear(); | ||||
| } else { | } else { | ||||
| runIndex.add(i); | runIndex.add(i); | ||||
| } | } | ||||
| if (currentText.indexOf("}}") != -1) { | |||||
| if (currentText.indexOf(END_STR) != -1) { | |||||
| changeValues(paragraph, currentRun, currentText, runIndex, map); | changeValues(paragraph, currentRun, currentText, runIndex, map); | ||||
| currentText = ""; | currentText = ""; | ||||
| isfinde = false; | isfinde = false; | ||||
| } | } | ||||
| } else if (text.indexOf("{") >= 0) {// 判断是不是开始 | |||||
| } else if (text.indexOf(START_STR) >= 0) {// 判断是不是开始 | |||||
| currentText = text; | currentText = text; | ||||
| isfinde = true; | isfinde = true; | ||||
| currentRun = run; | currentRun = run; | ||||
| } else { | } else { | ||||
| currentText = ""; | currentText = ""; | ||||
| } | } | ||||
| if (currentText.indexOf("}}") != -1) { | |||||
| if (currentText.indexOf(END_STR) != -1) { | |||||
| changeValues(paragraph, currentRun, currentText, runIndex, map); | changeValues(paragraph, currentRun, currentText, runIndex, map); | ||||
| isfinde = false; | isfinde = false; | ||||
| } | } | ||||
| @@ -207,23 +213,17 @@ public class ParseWord07 { | |||||
| XWPFTableRow row; | XWPFTableRow row; | ||||
| List<XWPFTableCell> cells; | List<XWPFTableCell> cells; | ||||
| Object listobj; | Object listobj; | ||||
| ExcelEntityParse excelEntityParse = new ExcelEntityParse(); | |||||
| for (int i = 0; i < table.getNumberOfRows(); i++) { | for (int i = 0; i < table.getNumberOfRows(); i++) { | ||||
| row = table.getRow(i); | row = table.getRow(i); | ||||
| cells = row.getTableCells(); | cells = row.getTableCells(); | ||||
| if (cells.size() == 1) { | |||||
| listobj = checkThisTableIsNeedIterator(cells.get(0), map); | |||||
| if (listobj == null) { | |||||
| parseThisRow(cells, map); | |||||
| } else if (listobj instanceof ExcelListEntity) { | |||||
| table.removeRow(i);// 删除这一行 | |||||
| excelEntityParse.parseNextRowAndAddRow(table, i, (ExcelListEntity) listobj); | |||||
| } else { | |||||
| table.removeRow(i);// 删除这一行 | |||||
| ExcelMapParse.parseNextRowAndAddRow(table, i, (List) listobj); | |||||
| } | |||||
| } else { | |||||
| listobj = checkThisTableIsNeedIterator(cells.get(0), map); | |||||
| if (listobj == null) { | |||||
| parseThisRow(cells, map); | parseThisRow(cells, map); | ||||
| } else if (listobj instanceof ExcelListEntity) { | |||||
| table.removeRow(i);// 删除这一行 | |||||
| new ExcelEntityParse().parseNextRowAndAddRow(table, i, (ExcelListEntity) listobj); | |||||
| } else { | |||||
| ExcelMapParse.parseNextRowAndAddRow(table, i, (List) listobj); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -264,7 +264,7 @@ public class ParseWord07 { | |||||
| Iterator<XWPFTable> itTable = doc.getTablesIterator(); | Iterator<XWPFTable> itTable = doc.getTablesIterator(); | ||||
| while (itTable.hasNext()) { | while (itTable.hasNext()) { | ||||
| table = itTable.next(); | table = itTable.next(); | ||||
| if (table.getText().indexOf("{{") != -1) { | |||||
| if (table.getText().indexOf(START_STR) != -1) { | |||||
| parseThisTable(table, map); | parseThisTable(table, map); | ||||
| } | } | ||||
| } | } | ||||
| @@ -15,12 +15,16 @@ | |||||
| */ | */ | ||||
| package org.jeecgframework.poi.word.parse.excel; | package org.jeecgframework.poi.word.parse.excel; | ||||
| import static org.jeecgframework.poi.util.PoiElUtil.*; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | |||||
| import org.apache.poi.xwpf.usermodel.XWPFTable; | import org.apache.poi.xwpf.usermodel.XWPFTable; | ||||
| import org.apache.poi.xwpf.usermodel.XWPFTableCell; | import org.apache.poi.xwpf.usermodel.XWPFTableCell; | ||||
| import org.apache.poi.xwpf.usermodel.XWPFTableRow; | import org.apache.poi.xwpf.usermodel.XWPFTableRow; | ||||
| import org.jeecgframework.poi.util.PoiPublicUtil; | |||||
| import com.google.common.collect.Maps; | |||||
| /** | /** | ||||
| * 处理和生成Map 类型的数据变成表格 | * 处理和生成Map 类型的数据变成表格 | ||||
| @@ -43,7 +47,8 @@ public final class ExcelMapParse { | |||||
| String text; | String text; | ||||
| for (int i = 0; i < cells.size(); i++) { | for (int i = 0; i < cells.size(); i++) { | ||||
| text = cells.get(i).getText(); | text = cells.get(i).getText(); | ||||
| params[i] = text == null ? "" : text.trim().replace("{{", "").replace("}}", ""); | |||||
| params[i] = text == null ? "" | |||||
| : text.trim().replace(START_STR, EMPTY).replace(END_STR, EMPTY); | |||||
| } | } | ||||
| return params; | return params; | ||||
| } | } | ||||
| @@ -56,26 +61,30 @@ public final class ExcelMapParse { | |||||
| * @param table | * @param table | ||||
| * @param listobj2 | * @param listobj2 | ||||
| */ | */ | ||||
| public static void parseNextRowAndAddRow(XWPFTable table, int index, List<Object> list) | |||||
| throws Exception { | |||||
| public static void parseNextRowAndAddRow(XWPFTable table, int index, | |||||
| List<Object> list) throws Exception { | |||||
| XWPFTableRow currentRow = table.getRow(index); | XWPFTableRow currentRow = table.getRow(index); | ||||
| String[] params = parseCurrentRowGetParams(currentRow); | String[] params = parseCurrentRowGetParams(currentRow); | ||||
| String listname = params[0]; | |||||
| boolean isCreate = !listname.contains(FOREACH_NOT_CREATE); | |||||
| listname = listname.replace(FOREACH_NOT_CREATE, EMPTY).replace(FOREACH_AND_SHIFT, EMPTY) | |||||
| .replace(FOREACH, EMPTY).replace(START_STR, EMPTY); | |||||
| String[] keys = listname.replaceAll("\\s{1,}", " ").trim().split(" "); | |||||
| params[0] = keys[1]; | |||||
| table.removeRow(index);// 移除这一行 | table.removeRow(index);// 移除这一行 | ||||
| int cellIndex = 0;// 创建完成对象一行好像多了一个cell | int cellIndex = 0;// 创建完成对象一行好像多了一个cell | ||||
| Map<String, Object> tempMap = Maps.newHashMap(); | |||||
| for (Object obj : list) { | for (Object obj : list) { | ||||
| currentRow = table.createRow(); | |||||
| currentRow = isCreate ? table.createRow() : table.getRow(index++); | |||||
| tempMap.put("t", obj); | |||||
| for (cellIndex = 0; cellIndex < currentRow.getTableCells().size(); cellIndex++) { | for (cellIndex = 0; cellIndex < currentRow.getTableCells().size(); cellIndex++) { | ||||
| currentRow | |||||
| .getTableCells() | |||||
| .get(cellIndex) | |||||
| .setText( | |||||
| PoiPublicUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) | |||||
| .toString()); | |||||
| String val = eval(params[cellIndex], tempMap).toString(); | |||||
| currentRow.getTableCells().get(cellIndex).setText(val); | |||||
| } | } | ||||
| for (; cellIndex < params.length; cellIndex++) { | for (; cellIndex < params.length; cellIndex++) { | ||||
| currentRow.createCell().setText( | |||||
| PoiPublicUtil.getValueDoWhile(obj, params[cellIndex].split("\\."), 0) | |||||
| .toString()); | |||||
| String val = eval(params[cellIndex], tempMap).toString(); | |||||
| currentRow.createCell().setText(val); | |||||
| } | } | ||||
| } | } | ||||