前言
最近有个项目需求,用java实现Excel导出功能,刚开始没接触过,有点蒙,找了一些资料看了才明白一些,在这里做下记录。
我使用的是@ExcelProperty注解,这个注解是匹配Excel和实体类字段之间的关系,也就是说实体类的字段使用了这个注解就会出现在Excel表头。@ExcelIgnore这个注解的意思就是忽略该字段,不写入Excel。
代码
controller
@SneakyThrows
@SysLog("导出")
@PostMapping(value = "/export")
@ApiOperation(value = "导出", notes = "导出")
public void exportData(HttpServletResponse response, @RequestBody Orde orde) {
OrdeService.exportExcel(response, search);
}
service
void exportExcel(HttpServletResponse response, Orde orde) throws IOException;
impl
@Override
public void exportExcel(HttpServletResponse response, Orde orde) throws IOException {
this.exportData(ordeh, response);
}
private void exportData(Orde orde, HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
String name = "Excel名称";
AbstractSheetWriteHandler handler = new OrdeHandler();
//编码 防止中文乱码
String fileName = URLEncoder.encode(StrUtil.isNotBlank(name) ? name : "下载", StandardCharsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
List<WorkExcelVO> workVOList = this.baseMapper.listVo(orde);
if (CollectionUtils.isNotEmpty(workVOList)) {
resetWorkOrderExcel(workVOList);
}
EasyExcel.write(response.getOutputStream(), WorkExcelVO.class)
.sheet(name).registerWriteHandler(handler)
.registerWriteHandler(ExcelWorkOrdeStyleUtil.cellStyleStrategy()).doWrite(workVOList);
}
response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding(StandardCharsets.UTF_8.name()); String name = "Excel名称" ; AbstractSheetWriteHandler handler = new OrdeHandler(); //编码 防止中文乱码 String fileName = URLEncoder.encode(StrUtil.isNotBlank(name) ? name : "下载", StandardCharsets.UTF_8.name());
这些都是导出的基础代码拿来直接用就行,OrdeHandler()如果有什么需求比如说表头下拉那些可以在里面进行配置,没得话直接重写下面的代码。
@Override public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { } @Override public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { }Content-disposition以什么方式下载,attachment就是附件的形式,后面的是文件名跟文件类型。
先把需要写入Excel的数据查出来,有些数字需要转换成中文的代码我放在resetWorkOrderExcel方法里面了,可以根据自己的需求进行编写。
后面的就是写入Excel,ExcelWorkOrdeStyleUtil这个工具类是Excel的样式。