今天接到一个优化需求,表格导出后的表头顺序和页面不一致,要优化成一致的。根据传入的字段,动态导出数据,并保证顺序。
我看到导出的实体类都有@ExcelProperty注解,同时也在官网查看了这注解的含义和使用。
@ExcelProperty有两个属性可以帮我们排序:index和order,所以我就想每次在去写excel的时候,对映射类字段的index去动态排序。
注意index的使用
- index的值相同时会抛出异常
- index的值不连续时会插入空白列
然后想直接用反射动态修改index
/**
*
* @param headList 前端上送的动态表头
* @param clazz 导出实体类的class对象
*/
private static void handleExcelHead(List<String> headList, Class<?> clazz) {
try {
for (String excelHead : headList) {
Field declaredField = clazz.getDeclaredField(excelHead);
ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation);
Field field = invocationHandler.getClass().getDeclaredField("memberValues");
field.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) field.get(invocationHandler);
memberValues.put("index", headList.indexOf(excelHead));
}
}catch (Exception e){
e.printStackTrace();