EasyExcel 自定义导出列和顺序

EasyExcel 自定义导出列和顺序

该功能需要前后端进行衔接 。前端需要传输两个集合,后端可以封装到一个对象中进行接收

集合1: List headList
在这里插入图片描述
集合2: List columnList 【对应后端实体类需要导出的字段】
在这里插入图片描述

代码块

前端可选择导出的列数和顺序

在这里插入图片描述

1. 实体类

	@Data
	public class ScenicAnalysis extends BaseEntity{
    
    
	    private static final long serialVersionUID = 1L;
	    
	    //需要导出的列的集合
	    private List<String> columnList;
	
	    //需要导出的列的集合
	    private List<String> headList;
	}

2. 控制层

    @PostMapping("/exportColumn")
    public void exportColumn(HttpServletResponse response, @RequestBody ScenicAnalysis scenicAnalysis) {
    
    
        scenicAnalysisService.exportColumn(response,scenicAnalysis);
    }

3. 方法层

    public void  exportColumn(HttpServletResponse response, ScenicAnalysis scenicAnalysis) {
    
    
        //根据自己的业务逻辑生成对应的List<Object>类型的集合
        List<Object> list = new ArrayList<>();
        try {
    
    
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            //控制 导出字段 未控制顺序
            EasyExcel.write(response.getOutputStream(), ScenicAnalysis.class)
                    .head(head(scenicAnalysis.getHeadList()))
                    .includeColumnFiledNames(scenicAnalysis.getColumnList())
                    .sheet("模板")
                    .doWrite(dataList(list,scenicAnalysis.getColumnList()));
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

4. 公共方法 (直接使用)

4.1 设置表头

    /**
   * 设置Excel头
   * @param headList  Excel头信息
   * @return
   */
  private static List<List<String>> head(List<String> headList) {
    
    
      List<List<String>> list = new ArrayList<>();
      for (String value : headList) {
    
    
          List<String> head = new ArrayList<>();
          head.add(value);
          list.add(head);
      }
      return list;
  }

4.2 设置表格信息

  /**
  * 设置表格信息
  * @param dataList  查询出的数据
  * @param fileList  需要显示的字段
  * @return
  */
 private static List<List<Object>> dataList(List<Object> dataList, List<String> fileList) {
    
    
     List<List<Object>> list = new ArrayList<>();
     for (Object person : dataList) {
    
    
         List<Object> data = new ArrayList<>();
         for (String fieldName : fileList) {
    
    
             /**通过反射根据需要显示的字段,获取对应的属性值*/
             data.add(getFieldValue(fieldName, person));
         }
         list.add(data);
     }
     return list;
 }

4.3 根据字段生成对应的get方法

    /**
   * 根据传入的字段获取对应的get方法,如name,对应的getName方法
   * @param fieldName  字段名
   * @param person    对象
   * @return
   */
  private static Object getFieldValue(String fieldName, Object person) {
    
    
      try {
    
    
          String firstLetter = fieldName.substring(0, 1).toUpperCase();
          String getter = "get" + firstLetter + fieldName.substring(1);
          Method method = person.getClass().getMethod(getter);
          return method.invoke(person);
      } catch (Exception e) {
    
    
          return null;
      }
  }

以上可根据自己的业务需求进行相应调整

导出结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nonita/article/details/129176195