[alibaba/easyexcel]多次导出之间相互影响

2024-02-19 923 views
9

版本:2.2.8 问题描述:一个实体,根据类型导出不同的列,导出之前设置列的顺序,第一个导出正常,第二个导出会出现空白列,顺序也有影响 关键代码: private static void setExcelIndex(Class<?> aClass, List columnNames) throws NoSuchFieldException, IllegalAccessException { //获取当前对象的字段 ArrayList fields = Lists.newArrayList(aClass.getDeclaredFields()); Class<?> superclass = aClass.getSuperclass(); if (superclass != null) {//有父类则获取父类对象的字段 fields.addAll(Lists.newArrayList(superclass.getDeclaredFields())); } for (int i = 0; i < columnNames.size(); i++) { for (Field field : fields) { if (!field.getName().equals(columnNames.get(i))) continue; ExcelProperty annotation = field.getAnnotation(ExcelProperty.class); if (annotation == null) continue; InvocationHandler handler = Proxy.getInvocationHandler(annotation); //获取 AnnotationInvocationHandler 的 memberValues 字段 Field fieldMv = handler.getClass().getDeclaredField("memberValues"); //因为这个字段事 private final 修饰,所以要打开权限 fieldMv.setAccessible(true); Map<Object, Object> memberValues = (Map<Object, Object>) fieldMv.get(handler); if (!memberValues.containsKey("value")) continue; memberValues.put("index", i); } } } 导出代码: setExcelIndex(aClass,includeColums) WriteSheet writeSheet = EasyExcel.writerSheet("模板").head(aClass).includeColumsNames(includeColums).build(); excelWriter.write(data(), writeSheet);

回答

6

每次导出以后,进行index重置,memberValues.put("index", -1);还是不能解决问题

4

表头会存储在一个数组里面,每次导出后,进行重置就可以解决顺序问题

3

如果你需要动态调整表头,可以使用动态的API,不要使用包括反射在内的黑科技。 表头有缓存 建议升级到最新版本,解决了缓存问题