Java 程序员须要读取 Excel 信息到 数据库 或者把 数据库 数据导出到 Excel 的需求,应该会想起 Apache POI 的方案。POI在业界公认的消耗内存容易内存溢出,可是这个不是我用 EasyExcel 的主要理由,我以为主要是 EasyExcel 的使用是在是太简单了。html
@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("名称")java
@ExcelProperty(value = "名称")
private String name;
复制代码
导出结果:git
若是须要把导出的 Integer 类型的数字转换成相对应的字符串,以前的选择是让全部的字段都是用 String ,而后在数据库用 if 语句进行判断,字段少的话还行,若是字段多就会让你的 SQL 语句变得很不友好。程序员
如今用 EasyExcel 后你能够在注解上是用自定义转换器 在官方文档有简单的使用。github
@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 项目的文档下都有,超级好用,简单,固然我这个自定义转换器文档没介绍。app