在导入的监听器中进行处理
通过反射得到对应的属性以及属性值,然后判断这些值是否为空,只要有一个不为空就判断这行数据不是空行,可以读取到集合中,但是当全为空时就不把这行数据加入集合。
@self
public class ExcelDataListener<T> extends AnalysisEventListener<T> {
public Map<Integer,ExcelImportSheetData<T>> sheetMap = Maps.newLinkedHashMap();
public Map<Integer,ExcelImportSheetData<T>> getDataList() {
return sheetMap;
}
@SneakyThrows
@Override
public void invoke(T data, AnalysisContext context) {
boolean exist = false;
String[] fieldName = getFieldName(data);
for(String string : fieldName){
Object fieldValue = getFieldValue(data, string);
if(fieldValue instanceof String){
if(StringUtils.isNotBlank((String)fieldValue)){
exist = true;
}
}
if(!Objects.isNull(fieldValue)){
exist = true;
}
}
if(!exist){
log.warn("该行被忽略,object={}", data);
return;
}
excelImportSheetDateFresh.addRowBean(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
}
/**
* 获取属性名数组
* */
public static String[] getFieldName(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
for(int i=0; i<fields.length; i++){
if(fields[i].isAnnotationPresent(ExcelProperty.class)){
fieldNames[i]=fields[i].getName();
}
}
return fieldNames;
}
/**
* 通过属性名获取属性值 忽略大小写
* @param o
* @param name
* @return
* @throws Exception
*/
public static Object getFieldValue(Object o,String name){
try {
Field[] fields = o.getClass().getDeclaredFields();
Object object = null;
for (Field field : fields) {
// 可以获取到私有属性
field.setAccessible(true);
if (field.getName().toUpperCase().equals(name.toUpperCase())) {
object = field.get(o);
break;
}
}
return object;
}catch (Exception e) {
log.warn("获取值异常,field={}", o, e);
return false;
}
}
}