目录
一、引入依赖
二、设置表头
三、web下载模板
四、测试下载功能
五、复杂表头
六、写入数据
七、格式优化
7.1 日期自定义转换
7.2 列宽行高注解
八、动态表头
九、动态表格写入数据
一、引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
二、设置表头
@ExcelProperty注解,作用在实体类属性上,用来对应Excel表头和属性。
@Data
public class SteelVarietyInfoVo {
@ExcelProperty("品种")
private String variety;
@ExcelProperty("应用领域")
private String domain;
@ExcelProperty("板坯类型")
private String plateType;
@ExcelProperty("牌号(钢种)")
private String steelGrade;
@ExcelProperty("创建时间")
private String createTime;
@ExcelProperty("修改时间")
private String updateTime;
}
三、web下载模板
@Api(tags = "excel工具")
@RestController
@RequestMapping("excel")
public class ExcelController {
@Resource
private SteelVarietyInfoService steelVarietyInfoService;
@ApiOperation("下载模板")
@GetMapping("/downloadTemplate")
public void downloadTemplate(HttpServletResponse response) throws IOException {
steelVarietyInfoService.downloadTemplate(response);
}
}
@Service
public class SteelVarietyInfoServiceImpl extends ServiceImpl<SteelVarietyInfoMapper, SteelVarietyInfo> implements SteelVarietyInfoService {
@Override
public void downloadTemplate(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String fileName = URLEncoder.encode("品种钢导入模板", StandardCharsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
write.sheet("模板").doWrite(() -> null);
}
}
四、测试下载功能
下载功能测试正常。
五、复杂表头
@ExcelProperty({"时间","创建时间"})
private String createTime;
@ExcelProperty({"时间","修改时间"})
private String updateTime;
通过如上传入String数组,即可生成多级表头。
六、写入数据
我们去数据库查询出所有的数据,然后写入excel对应的表头中。
@ApiOperation("导出全部数据到Excel")
@GetMapping("/exportAllDataExcel")
public void exportAllDataExcel(HttpServletResponse response) throws IOException {
steelVarietyInfoService.exportAllDataExcel(response);
}
@Override
public void exportAllDataExcel(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String fileName = URLEncoder.encode("品种钢数据", StandardCharsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream(), SteelVarietyInfoVo.class);
List<SteelVarietyInfoVo> list = this.findAllData();
write.sheet("全部数据").doWrite(list);
}
private List<SteelVarietyInfoVo> findAllData() {
List<SteelVarietyInfo> list = baseMapper.selectList(null);
List<SteelVarietyInfoVo> voList = new ArrayList<>();
for(SteelVarietyInfo item : list){
SteelVarietyInfoVo vo = new SteelVarietyInfoVo();
BeanUtils.copyProperties(item,vo);
vo.setCreateTime(item.getCreateTime().toString());
vo.setUpdateTime(item.getUpdateTime().toString());
voList.add(vo);
}
return voList;
}
七、格式优化
7.1 日期自定义转换
上面的例子中,我们发现,时间显示格式不符合日常习惯。
我们可以借助easyexcel提供的@DateTimeFormat注解来解决这个问题,但是要注意使用该注解就必须用时间类型去接收,String类型是无法完成转换的。时间类型使用Date、LocalDateTime都可以。
另外注意不要使用Spring提供的@DateTimeFormat注解,否则也无效。
@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
@ExcelProperty({"时间","创建时间"})
private LocalDateTime createTime;
@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
@ExcelProperty({"时间","修改时间"})
private LocalDateTime updateTime;
当然了,如果你不想用注解,用String类型来接收的话,那么就需要在代码里面自行处理完成后再返回,也是可以的。
7.2 列宽行高注解
我们还发现单元格有的挤在一块儿,建议表头文字占一行显示,这样更好看一点。
注解 | 描述 |
@ContentRowHeight(10) | 设置正文行高,作用在类上 |
@HeadRowHeight(20) | 设置表头行高,作用在类上 |
@ColumnWidth(25) | 设置列宽度,作用在类上、属性上 |
@Data
@HeadRowHeight(50)
@ContentRowHeight(30)
@ColumnWidth(20)
public class SteelVarietyInfoVo {
@ExcelProperty("品种")
private String variety;
@ExcelProperty("应用领域")
private String domain;
@ExcelProperty("板坯类型")
private String plateType;
@ExcelProperty("牌号(钢种)")
private String steelGrade;
@ColumnWidth(30)
@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
@ExcelProperty({"时间","创建时间"})
private LocalDateTime createTime;
@ColumnWidth(30)
@DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
@ExcelProperty({"时间","修改时间"})
private LocalDateTime updateTime;
}
八、动态表头
某些特殊场景下,我们需要动态展示表头,如果像之前这样写死表头就不行了。EasyExcel中也提供了动态表头的使用方法。
使用方式就不再是在对应属性上加上@ExcelProperty注解了。
而是获取到ExcelWriterBuilder对象后,调用head()方法,传递一个表头集合作为参数。
@ApiOperation("下载动态表头模板")
@GetMapping("/downloadDynamicHeadTemplate")
public void downloadDynamicHeadTemplate(HttpServletResponse response) throws IOException{
steelVarietyInfoService.downloadDynamicHeadTemplate(response);
}
@Override
public void downloadDynamicHeadTemplate(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String fileName = URLEncoder.encode("动态表头演示模板", StandardCharsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
write.head(head()).sheet("模板").doWrite(()->null);
}
/**
* 动态表头
*/
private List<List<String>> head() {
List<List<String>> header = new ArrayList<>();
List<String> head0 = new ArrayList<>();
head0.add("序号");
header.add(head0);
header.add(Arrays.asList("基本信息","姓名"));
List<String> head2 = new ArrayList<>();
head2.add("基本信息");
head2.add("性别");
List<String> head3 = new ArrayList<>();
head3.add("基本信息");
head3.add("联系方式");
header.add(head2);
header.add(head3);
header.add(Arrays.asList("额外信息","兴趣爱好"));
header.add(Arrays.asList("额外信息","健康状况"));
header.add(Arrays.asList("额外信息","家庭住址"));
ArrayList<String> headEnd = new ArrayList<>();
headEnd.add("是否统计");
header.add(headEnd);
return header;
}
这里提一嘴,表头的返回值是两层List集合 ☞ List<List<String>> head
可以这样理解:外层List表示列,内层List表示行。
九、动态表格写入数据
@ApiOperation("导出数据到动态Excel")
@GetMapping("/exportDataDynamicExcel")
public void exportDataDynamicExcel(HttpServletResponse response) throws IOException{
steelVarietyInfoService.exportDataDynamicExcel(response);
}
@Override
public void exportDataDynamicExcel(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String fileName = URLEncoder.encode("动态表头演示导出数据", StandardCharsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
ExcelWriterBuilder write = EasyExcel.write(response.getOutputStream());
write.head(head()).sheet("清单").doWrite(dynamicData());
}
private List<List<String>> dynamicData() {
List<List<String>> list = new ArrayList<>();
list.add(Arrays.asList("1","小黑","男","15312345678","唱跳rap篮球","良好","北京市朝阳区xxx","是"));
list.add(Arrays.asList("2","小白","男","15312341234","护花","良好","北京市朝阳区xxx","是"));
return list;
}