有一次在工作中收到导出表格的需求,但是数据库里面没有这张表。要根据方法返回的集合导出表格。其实有没有表都可以用,稍微变通一下就好了,相信你是懂的。
首先需要一张导出的excel的模板。如下
接着创建实体类
注意 {. }里的内容要和实体类字段名称保持一致模板右上角不带 . 的{ } 为代码中自定义的数据后面会详细说到
导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta1</version>
</dependency>
在resources下面创建包excel-template 然后把你事先设计好的表格复制到这个包下面
创建Controller下面的代码可以直接复制使用 但有些地方需要修改注意看注释!!!
@RestController
@Api(tags = "[管理端]表格导出相关API")
@RequestMapping("/api.manage/v1/excel_out")
@Slf4j
@AllArgsConstructor
public class ExportController {
private StatisticsService statisticsService;
@ApiOperation(value = "导出电站营收统计表", produces = "application/octet-stream")
@PostMapping("/station_revenue_out")
public void stationRevenueOut(@RequestBody SearchModel<RevenueSearch> searchModel, HttpServletRequest httpServletRequest, HttpServletResponse response){
try {
RevenueSearch searchParam = searchModel.getSearchParam();
InputStream templateInputStream = getClass()
.getClassLoader().getResourceAsStream("excel-template/revenue_search_out.xlsx");//这个地方写的是你的表格放的路径根据自己的修改!!!
// 设置输出目标和模板
String thisDate = DateUtil.format(new Date(),"yyyyMMdd");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
String fileName = URLEncoder.encode("电站营收统计表_"+ thisDate , "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
//通过输出流进行文件下载
ServletOutputStream out = response.getOutputStream();
ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(templateInputStream).build();
// 创建 Sheet 开始填充数据
WriteSheet writeSheet = EasyExcel.writerSheet(0).build();
// 注意:forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,
//然后下面的数据往后移动。默认 是false,会直接使用下一行,
//如果没有则创建。这会把所有数据放到内存,数据量大时会很耗内存
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充 list变量 {.字段名}
List<ExportRevenueExcel> exportRevenueExcels = statisticsService.stationRevenueList(searchModel.getSearchParam());
//此处的方法返回的集合就是我要导出的表格中的数据的集合(exportRevenueExcels)!!!
log.info(exportRevenueExcels.toString());
excelWriter.fill(exportRevenueExcels, fillConfig, writeSheet);
String startMonth = DateUtil.format(searchParam.getStartMonth(), "yyyy-MM");
String endMonth = DateUtil.format(searchParam.getEndMonth(), "yyyy-MM");
Map<String, Object> map = new HashMap<>(3);
if (StrUtil.isNotEmpty(startMonth)){
map.put("startMonth", startMonth);
}else {
map.put("startMonth", "");
}
if (StrUtil.isNotEmpty(endMonth)){
map.put("endMonth", endMonth);
}else {
map.put("endMonth", "");
}
//这个map就是用来设计表格右上角{}里面的数据 我的是放的起止时间
excelWriter.fill(map, writeSheet);
excelWriter.finish();
out.flush();
out.close();
} catch (Exception e) {
log.error("export excel error", e);
}
}
}
不带 . 的{}就是根据map的key存值 key就是{}里面你自己写的字段
入行不久 欢迎指正。