一、导出
1、引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.2</version>
</dependency>
2、controller层代码
@GetMapping("/export/back")
public Result batchExport(@ModelAttribute CaseDeclareModel caseDeclare,
HttpServletResponse response){
List<CaseDeclareModel> caseDeclares = caseDeclareBiz.selectByModel(caseDeclare);
if (isEmpty(caseDeclares)) {
return Result.builder().data(Collections.emptyList()).build();
}
//caseDeclares为查询出的数据
//response为返回对象
try {
caseDeclareBiz.exportCaseDeclares(caseDeclares, response);
}catch (Exception e){
return Result.builder().error(TextConst.OPERATE_FAIL_ERROR).build();
}
return Result.builder().ok(TextConst.OPERATE_SUCCESS).build();
}
3、biz层代码
List<CaseDeclareExcelTemplateDTO> dtos = new ArrayList<>();
//。。。省略数据清理
createCaseDeclareExcel(dtos, response);
4、createCaseDeclareExcel方法
private void createCaseDeclareExcel(List<CaseDeclareExcelTemplateDTO> dtos, HttpServletResponse response) throws IOException {
try {
//定义文件名
String fileName = "案例申报信息-" + LocalDateTimeUtils.formatNow(LocalDateTimeUtils.DEFAULT_DATETIME_FORMAT);
//设置返回的数据类型
response.setContentType("application/vnd.ms-excel");
//设置返回的数据编码格式
response.setCharacterEncoding("utf-8");
//设置返回头
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
// 表头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
//水平居中
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 单元格内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
//水平居左
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
//垂直居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 这个策略是 头、是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
EasyExcel.write(response.getOutputStream())
//设置自定义样式
.registerWriteHandler(horizontalCellStyleStrategy)
//设置动态表头
.head(head(dtos))
//流禁止自动关闭
.autoCloseStream(Boolean.FALSE)
//设置sheet名称
.sheet("案例申报信息")
//设置导出的数据
.doWrite(data(dtos));
} catch (Exception e) {
//如果导出异常,则返回特定的消息
// 重置response
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
Map<String, String> map = new HashMap<String, String>();
map.put("status", HttpResponseConst.SC_BAD_REQUEST);
map.put("message", TextConst.FILE_DOWNLOAD_FAIL_ERROR.concat("\t").concat(e.getMessage()));
response.getWriter().println(toJSONString(map));
}
}
5、head方法-动态表头方法
private List<List<String>> head(List<CaseDeclareExcelTemplateDTO> dtos) {
List<List<String>> resultList = new ArrayList<>();
resultList.add(Arrays.asList("提交人"));
List<Integer> counts = new ArrayList<>();
dtos.stream().forEach(dto -> {
List<BadManDto> badManDtos = dto.getBadManDtos();
if (CollectionUtils.isNotEmpty(badManDtos)) {
counts.add(badManDtos.size());
}
});
if (CollectionUtils.isNotEmpty(counts)) {
max = Collections.max(counts);
}
if (max > 0) {
for (int i = 0; i < max; i++) {
resultList.add(Arrays.asList("人员" + (i + 1)));
resultList.add(Arrays.asList("身份证号"));
resultList.add(Arrays.asList("抓获时间"));
}
}
return resultList;
}
将接收到的数据集合封装出动态表头。
常规的数据先包装,动态表头最后附加。
6、data方法-动态数据方法
private List<List<String>> data(List<CaseDeclareExcelTemplateDTO> dtos) {
List<List<String>> resultList = new ArrayList<>();
for (CaseDeclareExcelTemplateDTO dto : dtos) {
List<String> dataList = new ArrayList<>();
dataList.add(testStr(dto.getState()));
List<BadManDto> badManDtos = dto.getBadManDtos();
if (CollectionUtils.isNotEmpty(badManDtos)) {
badManDtos.stream().forEach(it -> {
dataList.add(testStr(it.getName()));
});
}
resultList.add(dataList);
}
return resultList;
}
将数据包装为集合。
先包装常规数据,最后附加动态数据。
7、模板文件对象
@Data
@ColumnWidth(40)
public class CaseDeclareExcelTemplateDTO extends BaseRowModel {
@ExcelProperty(value = "反馈状态", index = 0)
private String state;
}
如果导入导出的数据是常规的,则可以直接利用模板文件对象。