EasyExcel 导出Excel

7,358 阅读2分钟

前言

Java 程序员需要读取 Excel 信息到 数据库 或者把 数据库 数据导出到 Excel 的需求,应该会想起 Apache POI 的方案。POI在业界公认的消耗内存容易内存溢出,但是这个不是我用 EasyExcel 的主要理由,我觉得主要是 EasyExcel 的使用是在是太简单了。

WEB下载

@GetMapping("/excel")
@ApiOperation(value = "导出", notes = "导出")
public void excel(HttpServletResponse response, AttractInvestmentParam attractInvestmentParam) throws IOException {
	response.setContentType("application/vnd.ms-excel");
	response.setCharacterEncoding("utf-8");
  	// 保证下载到本地文件名不乱码的
	String fileName = URLEncodez zr.encode("模版", "UTF-8");
	response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
 	// List<模型> 的数据体,替换成自己的业务代码即可
	List<ZhAttractInvestmentQueryVO> aiList = zhAttractInvestmentService.attractInvestmentExcel(attractInvestmentParam);
	EasyExcel.write(response.getOutputStream(), ZhAttractInvestmentQueryVO.class).sheet("sheet").doWrite(aiList);
	}

你需要处理你的导出模型:把你需要导出的数据封装成实体类,在属性上面加上 @ExcelProperty("名称")

@ExcelProperty(value = "名称")
private String name;

导出结果:

自定义处理


如果需要把导出的 Integer 类型的数字转换成相对应的字符串,之前的选择是让所有的字段都是用 String ,然后在数据库用 if 语句进行判断,字段少的话还行,如果字段多就会让你的 SQL 语句变得很不友好。

现在用 EasyExcel 后你可以在注解上是用自定义转换器 在官方文档有简单的使用。

@ExcelProperty(value = "投资方式",converter = InvestmentModeConverter.class)
private Integer investmentMode;

converter = InvestmentModeConverter.class 这个就是转换的核心类,下面是这个类的代码

public class InvestmentModeConverter implements Converter<Integer> {

   //这个是需要被转换结果或者匹配内容
   private static final String A = "独资";
   private static final String B = "合资";
   private static final String C = "独资或合资";

  //这个接口是返回Java中的对象类型
   @Override
   public Class supportJavaTypeKey() {
      return Integer.class;
   }
  //这个接口是返回到Excel的类型
   @Override
   public CellDataTypeEnum supportExcelTypeKey() {
      return CellDataTypeEnum.STRING;
   }
    /**
     * convertToJavaData 从方法名就能看出来 转换成Java数据,把Excel转换成实体类
     * 解析数据就用到的是这个方法
     * 要是表格内容是 独资 到 实体类 后就变成 Integer类型 1;合资 到 实体类 后就变成 Integer类型 2
     */
   @Override
   public Integer convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
      String stringValue = cellData.getStringValue();
      if (A.equals(stringValue)) {
         return 1;
      } else if (B.equals(stringValue)) {
         return 2;
      } else {
         return 3;
      }
   }
    /**
     * 这个方法是我们的主角 convertToExcelData 翻译过来就是 转换到 Excel 数据
     * 和上面的方法类似,只不过反了下,实体类字段的值是 1 就转换成 独资;2 转换成 独资
     */
   @Override
   public CellData convertToExcelData(Integer integer, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
      CellData cellData;
      if (integer == 1) {
         cellData = new CellData(A);
      } else if (integer == 2) {
         cellData = new CellData(B);
      } else {
         cellData = new CellData(C);
      }
      return cellData;
   }
}

最后

到这里导出基本就没上面障碍了,还有同学需要使用到多表头,写入到指定列,写入模版,填充 Excel ,读取 Excel 等等之类的操作,在 alibaba-easyexcel.github.io/index.html 这个 alibaba/easyexcel 项目的文档下都有,超级好用,简单,当然我这个自定义转换器文档没介绍。