@@ -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); | |||||
} | } | ||||
} | } | ||||