前置简单使用请参考easypoi API文档:
1.首先是easypoi多sheet页导出:
和普通导出有一些区别,首先对多数据按指定的字段进行分类,之后按不同类型存入不同sheet页,代码如下:
@ApiOperation("导出抵质押品续封续冻资产")
@PostMapping("/export")
public ResponseResult exportFreezeLock(@RequestBody Map<String, Object> request, HttpServletResponse response) throws Exception {
//查询抵质押品续封续冻资产
QueryWrapperUtil qu = new QueryWrapperUtil();
QueryWrapper<AmcAstFreezeLockB> queryWrapper = qu.getWrapper(request, AmcAstFreezeLockB.class,"astFreezeLock","documentNumber");
Boolean isPage = true; //是否分页
List<AmcAstFreezeLockB> records = null;
if (isPage) {
IPage<AmcAstFreezeLockB> result = amcAstFreezeLockBService.page(getIPage(request),queryWrapper);
records = result.getRecords();
} else {
records = amcAstFreezeLockBService.list(queryWrapper);
}
Map<String, List<AmcAstFreezeLockB>> typeMap = null;
if(CollectionUtils.isNotEmpty(records)){
records.stream().forEach(t->{
if(StringUtils.isNotBlank(t.getDataStatus()) && "1".equals(t.getDataStatus())){
t.setDataStatus("");
}
});
typeMap = records.stream().collect(Collectors.groupingBy(AmcAstFreezeLockB::getAssetsTypeRoacf));
}
//获取模板路径
exportAssetStanding(request,response,typeMap);
return result();
}
private void exportAssetStanding(Map<String, Object> request, HttpServletResponse response, Map<String, List<AmcAstFreezeLockB>> typeMap) throws IOException, ParseException {
//获取模板存储路径
String templateUrl = "config/excel/amcAstFreezeLock/amcAstFreezeLock_export.xlsx";
InputStream templateIs = new ClassPathResource(templateUrl).getInputStream();
Workbook templateWb = WorkbookFactory.create(templateIs);
String nowDateStr = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
//数据,模板和模板地址都准备好了,开始处理
Workbook wb = amcAstFreezeLockBService.writeExcelJz(templateWb, templateUrl,typeMap);
FileUtil.download(response, wb, "抵质押品续封续冻资产"+"-"+nowDateStr+".xlsx");
}
首先是数据的简单处理,模板的获取,准备完成后开始按照多sheet导出方法的数据格式拼装数据:
//该方法作为导出前数据处理,将数据处理为符合多sheet导出方法的数据格式
public Workbook writeExcelJz(Workbook templateWb, String templateUrl, Map<String, List<AmcAstFreezeLockB>> typeMap) {
//获取资产类型
List<BaseDictionary> assetTypeList = ValueSetUtils.get("gdfamc_ast_assets");
//写入到excel
//获取导入模板作为导出模板
TemplateExportParams params = new TemplateExportParams();
params.setTemplateUrl(templateUrl);
params.setTemplateWb(templateWb);
params.setHeadingStartRow(0);
//设置表头占行数
params.setHeadingRows(3);
//设置是否导出全部sheet页,实测数据分类有几种导出几个,并不会导出空sheet
params.setScanAllsheet(true);
//设置字段值集处理器,easypoi也有,这个是封装过的
params.setDictHandler(new ValueSetDictHandler());
Map<Integer,List<Map<String,Object>>> map = new HashMap<>();
//循环根据资产类型放入不同sheet页
for (Map.Entry<String, List<AmcAstFreezeLockB>> entry : typeMap.entrySet()) {
List<Map<String, Object>> mList = new ArrayList<>();
Map<String, Object> m1 = Maps.newHashMap();
//dataList与excel导出模板对应
m1.put("dataList", entry.getValue());
mList.add(m1);
if ("03".equals(entry.getKey())){//在建工程 sheet页0
map.put(0,mList);
}else if ("04".equals(entry.getKey())){//银行存款
map.put(1,mList);
}else if ("05".equals(entry.getKey())){//设备
map.put(2,mList);
}else if ("06".equals(entry.getKey())){//车辆
map.put(3,mList);
}else if ("07".equals(entry.getKey())){//股权
map.put(4,mList);
}else if ("09".equals(entry.getKey())){//不动产
map.put(5,mList);
}else if ("10".equals(entry.getKey())){//仓单
map.put(6,mList);
}else if ("11".equals(entry.getKey())){//存单
map.put(7,mList);
}else if ("12".equals(entry.getKey())){//票据
map.put(8,mList);
}else if ("13".equals(entry.getKey())){//其他资产
map.put(9,mList);
}
}
Workbook workbook = this.exportExcelClone(map, params);
return workbook;
}
//这个就是多sheet导出调用的方法,easypoi的ExcelExportUtil工具类中有,这里单独写是因为原方法中没有值集处理器,重写后给设置了值集处理,正常到这里就可以了
private Workbook exportExcelClone(Map<Integer, List<Map<String, Object>>> map,
TemplateExportParams params) {
return new ExcelExportOfTemplateUtilC().createExcelCloneByTemplate(params, map);
}
添加值集处理:
2.导出时时间格式化
这里采用的时excel模板导出的形式,尝试了在实体类@Excel注解中添加format=“yyyy-MM-dd”注解无效,网上搜索说时导出时easypoi会自动将date类型转String,所以格式化无效,采用解决方案是在模板中通过模板语法进行日期格式化,如下:
{{$fe: dataList 确定数据源
导出时对应值集:
导出时日期格式化: