前言
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 项目的文档下都有,超级好用,简单,当然我这个自定义转换器文档没介绍。