记录easypoi的使用,代码使用版本是:4.4.0
@Excel注解常用属性
属性 | 类型 | 说明 |
---|---|---|
name | String | 列名,动态设置排除字段时使用此值 |
width | double | 设置excel列宽 |
format | String | 时间格式,eg:yyyy年MM月dd日 |
replace | String[] | 值替换,简单数字、字母转中文配置,eg:{“女_0”,"男_1"} |
suffix | String | 文字后缀,eg:% 90 导出为 90% |
dict | String | 自定义字典转换处理器时字段标识值 |
@Data
public class UserInfoVo {
/*
姓名
*/
@Excel(name = "姓名",width = 10.25)
private String userName;
/*
出生年月日
*/
@Excel(name = "出生日期",format = "yyyy年MM月dd日",width = 20)
@JsonFormat(pattern = "yyyy年MM月dd日")
private Date birthDay;
/*
性别
*/
@Excel(name = "性别",replace = {"女_FEMALE","男_MAL"},suffix = "生")
private SexEnum sex;
/*
电话
*/
@Excel(name = "手机号码",width = 14.50)
private String phone;
/*
邮箱
*/
@Excel(name = "邮箱地址",width = 20)
private String email;
/*
地址
*/
@Excel(name = "详细地址",width = 30)
private String addr;
/*
爱好
*/
@Excel(name = "爱好",dict = "hobby",width = 30)
private String[] hobbys;
/*
学历
*/
@Excel(name = "学历",dict = "education",width = 20)
private EducationEnum education;
}
IExcelDictHandler
继承IExcelDictHandler接口结合dict注解实现导入导出内容转义,代码中hobbys和education就是通过实现此接口实现导出内容的自定义。
public class ExcelCommonHandlerImpl implements IExcelDictHandler {
/**
* 转换为excel显示支
* @param s excel注解dict属性的值
* @param o 对象
* @param s1 属性名
* @param o1 属性值
* @return
*/
@Override
public String toName(String s, Object o, String s1, Object o1) {
if (ObjectUtils.isEmpty(o1) || ObjectUtils.isEmpty(s)) {
return "";
}
String res = "";
switch (s) {
case "education":
res = ((EducationEnum)o1).getMsg();
break;
case "hobby":
res = parseHobby(o1);
break;
}
return res;
}
@Override
public String toValue(String s, Object o, String s1, Object o1) {
return null;
}
private String parseHobby(Object o1) {
String[] strArr = (String[]) o1;
return String.join(",", strArr);
}
}
导出
在导出时可以通过两种方式动态调整导出的列
- 通过设置ExportParams对象的exclusions字段来动态调整不需要导出的列,设置的值是Excel注解name属性值;
- 动态构建List<ExcelExportEntity>值来实现动态列导出
测试代码使用了设置exclusions字段的时来动态移除“详细地址的导出”
public void export(HttpServletResponse response) throws Exception {
List<UserInfoVo> lst = UserInfoVo.createList();
ExportParams exportParams = new ExportParams();
exportParams.setDictHandler(new ExcelCommonHandlerImpl());
exportParams.setType(ExcelType.XSSF);
//根据Excel注解name值动态移除不需要导出的字段
exportParams.setExclusions(new String[]{"详细地址"});
Workbook workbook = null;
ServletOutputStream out = null;
try {
workbook = ExcelExportUtil.exportExcel(exportParams, UserInfoVo.class, lst);
String fileName = "a.xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
out = response.getOutputStream();
workbook.write(out);
} catch (Exception ex) {
ex.printStackTrace();
response.setStatus(500);
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().print("失败");
} finally {
if (out != null) {
IoUtil.close(out);
}
if (workbook != null) {
if (workbook instanceof SXSSFWorkbook) {
((SXSSFWorkbook) workbook).dispose();
}
workbook.close();
}
}
}
导出结果:
大数据导出
使用ExcelExportUtil.exportBigExcel实现大数据导出,此方法包含一个IExcelExportServer接口参数,需要自定义实现此接口分批获取数据;
public class ExcelExportServerImpl implements IExcelExportServer {
private final Integer SIZE = 10000;
@Autowired
private TestMapper testMapper;
/**
*
* @param o exportBigExcel方法最后一个参数
* @param pageIndex
* @return
*/
@Override
public List<Object> selectListForExcelExport(Object o, int pageIndex) {
TestQuery query = (TestQuery)o;
query.setCurrent(pageIndex);
query.setSize(SIZE);
List limitList = testMapper.pageList(query);
System.out.println("查询"+pageIndex+"次");
return limitList;
}
}
导出:
public void bigExport(TestQuery query, IExcelExportServer exportServer, HttpServletResponse response) throws Exception{
ExportParams exportParams = new ExportParams();
exportParams.setDictHandler(new ExcelCommonHandlerImpl());
exportParams.setType(ExcelType.XSSF);
Workbook workbook = null;
try{
workbook = (SXSSFWorkbook) ExcelExportUtil.exportBigExcel(exportParams, Test.class, exportServer, query);
}catch (Exception ex){
}
finally {
if (workbook != null) {
//大数量使用exportBigExcel导出时需要手动释放,实例必须是SXSSFWorkbook对象(只有SXSSFWorkbook对象才有dispose方法);
//在使用exportBigExcel时会构建临时文件,只有当应用重启或者关闭时才会自动删除这些临时文件,通过调用dispose方法在每次导出之后立马清除这些临时文件。
if (workbook instanceof SXSSFWorkbook) {
((SXSSFWorkbook) workbook).dispose();
}
workbook.close();
}
}
}
模板导出
不改变excel原有样式进行导出,记录下已经使用过的指令:
{{}}代表表达式,然后根据表达式里面的数据取值
指令 | 描述 | 用法 |
---|---|---|
fe | 遍历数据,创建row | fe:list |
&INDEX& | 循环中的序号,自动添加 | &INDEX& |
fd | 格式化时间 | fd:(t.date;yyyy年MM月dd日) |
dict | 字典 | dict:hobby;t.hobbys |
Tip:fe:list中list对应map的key,取值时使用t.字段名,使用其它别名数据出不来
@GetMapping(value = "/templateExport", produces = "application/octet-stream")
public void templateExport(HttpServletResponse response) throws Exception{
List<UserInfoVo> lst = UserInfoVo.createList();
//sheetNum指定要导出的sheet的序号,可以导出多个sheet,此处导出sheet1和sheet2
TemplateExportParams params = new TemplateExportParams("static/m.xlsx", 0, 1);
params.setDictHandler(new ExcelCommonHandlerImpl());
ServletOutputStream out = null;
Map<String, Object> map = new HashMap<String, Object>();
map.put("list", lst);
try {
Workbook workbook = ExcelExportUtil.exportExcel(params, map);
String fileName = "d.xlsx";
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
out = response.getOutputStream();
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
IoUtil.close(out);
}
}
}
导出结果: