监听器
/**
* ExcelImportReadListener
* 监听器
*
* @author [email protected]
* @date 2022年09月01日 上午10:07
*/
@Slf4j
public class ExcelImportReadListener<T> extends AnalysisEventListener<T> {
/**
* 记录错误
*/
public Map<Integer, Map<Integer, FailRecordEntity>> failListMap = new HashMap<>(16);
/**
* excel中读取的数据
*/
public List<T> excelDates = new ArrayList<T>();
Class clazz;
/**
* 批注、超链接、合并单元格信息等
*
* @param extra
* @param context
* @author [email protected]
* @date 2022/9/6 下午2:26
*/
@Override
public void extra(CellExtra extra, AnalysisContext context) {
super.extra(extra, context);
}
public ExcelImportReadListener(Class clazz) {
super();
this.clazz = clazz;
}
/**
* 读取表头内容
*/
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
log.info("解析到一条头数据:" + headMap.toString());
// count 记录模板表头有几个,用以判断用户导入的表格是否和模板完全一致
// 如果用户导入表格较模板的表头多,但其余符合模板,这样不影响则不需要
int count = 0;
// 获取数据实体的字段列表
Field[] fields = clazz.getDeclaredFields();
// 遍历字段进行判断
for (Field field : fields) {
// 获取当前字段上的ExcelProperty注解信息
ExcelProperty fieldAnnotation = field.getAnnotation(ExcelProperty.class);
// 判断当前字段上是否存在ExcelProperty注解
if (fieldAnnotation != null) {
++count;
// 存在ExcelProperty注解则根据注解的index索引到表头中获取对应的表头名
String headName = headMap.get(fieldAnnotation.index());
// 判断表头是否为空或是否和当前字段设置的表头名不相同
if (StringUtils.isEmpty(headName) || !headName.equals(fieldAnnotation.value()[0])) {
// 如果为空或不相同,则抛出异常不再往下执行
throw new ExcelAnalysisException("MRM.Excel.Import.Template.Exception");
}
}
}
// 判断用户导入表格的标题头是否完全符合模板(字段确定后打开)
/* if (count != headMap.size()) {
throw new ExcelAnalysisException("MRM.Excel.Import.Template.Exception");
}*/
}
/**
* 通过class获取类字段信息
*/
public Map<Integer, String> getIndexNameMap(Class clazz) throws NoSuchFieldException {
Map<Integer, String> result = new HashMap<>(16);
Field field;
//获取类中所有的属性
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
field = clazz.getDeclaredField(fields[i].getName());
field.setAccessible(true);
//获取根据注解的方式获取ExcelProperty修饰的字