com.jeesuite.common2.excel.helper.ExcelBeanHelper Maven / Gradle / Ivy
package com.jeesuite.common2.excel.helper;
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.StringUtils;
import com.jeesuite.common2.excel.ExcelOperBaseException;
import com.jeesuite.common2.excel.annotation.TitleCell;
import com.jeesuite.common2.excel.model.ExcelMeta;
import com.jeesuite.common2.excel.model.TitleMeta;
public class ExcelBeanHelper {
private static Map> aliasPropertyDescriptorCache = new ConcurrentHashMap>();
private static Map titleCellBeanCache = new ConcurrentHashMap();
public static List setRowValues(Class clazz,List contents){
try {
Map pds = getAliasPropertyDescriptors(clazz);
List results = new ArrayList<>();
if(contents.isEmpty())return results;
String[] titles = getExcelMeta(clazz).getFinalTitles();
int titleRowCount = getExcelMeta(clazz).getTitleRowNum();
//解析内容标题内容为数组
List contentTitles = new ArrayList<>();
//第一行为sheet信息
for (int i = 1; i <= titleRowCount; i++) {
contentTitles.addAll(Arrays.asList(contents.get(i).split(ExcelValidator.FIELD_SPLIT)));
}
for (int i = 0; i < titles.length; i++) {
if(titleRowCount == 1){
if(!StringUtils.equals(titles[i], contentTitles.get(i)))throw new ExcelOperBaseException("格式错误,没有找到列["+titles[i] + "]");
}else{
if(!contentTitles.contains(titles[i]))throw new ExcelOperBaseException("格式错误,没有找到列["+titles[i] + "]");
}
}
String[] vals = null;
for (int i = titleRowCount + 1; i < contents.size(); i++) {
String line = contents.get(i);
if(line.startsWith(ExcelValidator.SHEET_NAME_PREFIX)){
throw new ExcelOperBaseException("模板错误(暂不支持多个sheet)");
}
T instance = clazz.newInstance();
vals = line.split(ExcelValidator.FIELD_SPLIT);
boolean anyColumnNotEmpty = false;
inner:for (int j = 0; j < titles.length; j++) {
if(vals.length < j + 1 )break inner;
anyColumnNotEmpty = anyColumnNotEmpty || StringUtils.isNotBlank(vals[j]);
PropertyDescriptor propertyDescriptor = pds.get(clearWrapper(titles[j]).trim());
if(propertyDescriptor != null && vals[j] != null){
try {
Object rawValue = rawValue(vals[j],propertyDescriptor.getPropertyType());
propertyDescriptor.getWriteMethod().invoke(instance, rawValue);
} catch (Exception e) {
// TODO: handle exception
}
}
}
if(anyColumnNotEmpty){
results.add(instance);
}
}
return results;
} catch (Exception e) {
if(e instanceof ExcelOperBaseException)throw (ExcelOperBaseException)e;
throw new BeanConverterException(e);
}
}
public static List