easyExcel解析复杂表头数据

时间:2025-03-19 16:46:17
public class MdExcelListener<T> extends AnalysisEventListener<T> { private static final Logger log = LoggerFactory.getLogger(MdExcelListener.class); //表头所在行数 private int headRowNumber; //开始读取行数,实际再+1 private int startRowNumber; // Excel对象 private Class<T> clazzT; public MdExcelListener() { } public MdExcelListener(int headRowNumber, int startRowNumber, Class<T> clazzT) { this.headRowNumber = headRowNumber; this.startRowNumber = startRowNumber; this.clazzT = clazzT; } /** * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收 */ private static final int BATCH_COUNT = 100; /** * 缓存的数据 */ private List<T> cachedDataList = ListUtils.newArrayList(); @Override public void invoke(T data, AnalysisContext context) { if (context.readRowHolder().getRowIndex().intValue() > startRowNumber) { //("解析到一条数据:{}", (data)); cachedDataList.add(data); } } /** * @param headMap 传入Excel的头部(第headRowNumber行数据)数据的index,name * @param context * @description: 校验Excel头部格式,必须完全匹配 * @date 2019/12/24 19:27 */ private static int i=0; @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { i++; if (i == headRowNumber) { super.invokeHeadMap(headMap, context); validExcelHeader(headMap, clazzT); } } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } /** * @param clazzT * @return <, > * @description: 获取注解里ExcelProperty的value,用作校验excel * @date 2021/12/09 19:21 */ public static <T> void validExcelHeader(Map<Integer, String> headMap, Class<T> clazzT) { System.out.println("表头检验"); // 判断传入对象 if (Objects.isNull(clazzT)) { return; } // 获取表头值 Collection<String> heads = headMap.values(); // 获取类注解的表头值 Set<String> nameMap = getNameSet(clazzT); // 循环验证表头是否正确 for (String head : heads) { if (!nameMap.contains(head)) { throw new BizException("解析excel表头与模板不符,解析失败"); } } } static <T> Set<String> getNameSet(Class<T> clazzT) { Set<String> result = new HashSet<>(); Field[] fields = clazzT.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); if (excelProperty != null) { String[] values = excelProperty.value(); StringBuilder value = new StringBuilder(); for (String v : values) { value.append(v); } result.add(value.toString()); } } return result; } public List<T> getCachedDataList() { return cachedDataList; } }