EasyExcel动态表头,复杂数据导出
最终效果图
该导出报表是使用response输出文件流,浏览器下载导出Excel文件
下图为最终导出的效果
Controller层代码
@GetMapping("/Export")
public void weekExport(HttpServletResponse response, VoucherTableHeadVO voucherTableHeadVO) {
try {
String sheetName = "化验周报表";
String fileName = sheetName.concat(String.valueOf(System.currentTimeMillis())).concat(".xlsx");
//设置单元格合并策略
//LoopMergeStrategy(行数, 列数)合并
LoopMergeStrategy loopMergeStrategy1 = new LoopMergeStrategy(4, 0);
LoopMergeStrategy loopMergeStrategy2 = new LoopMergeStrategy(4, 1);
LoopMergeStrategy loopMergeStrategy3 = new LoopMergeStrategy(4, 2);
LoopMergeStrategy loopMergeStrategy4 = new LoopMergeStrategy(4, 3);
LoopMergeStrategy loopMergeStrategy5 = new LoopMergeStrategy(4, 4);
//表头数据
List<List<String>> headList =voucherQualityService.setHeadList(voucherTableHeadVO);
//表数据
List<List<Object>> lists = voucherQualityService.setWeekList(voucherTableHeadVO);
//response输出文件流
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
//写入表头,模板,单元格合并策略,表数据
EasyExcel.write(response.getOutputStream()).head(headList).sheet("Sheet1").registerWriteHandler(loopMergeStrategy1).registerWriteHandler(loopMergeStrategy2)
.registerWriteHandler(loopMergeStrategy3)
.registerWriteHandler(loopMergeStrategy4)
.registerWriteHandler(loopMergeStrategy5)
.doWrite(lists);
System.out.println("导出成功!");
}catch (Exception e){
}
}
动态表头
表头后半部分的属性是通过查询数据库获得的,每种产品对应的属性数和属性均不相同
@Override
public List<List<String>> setHeadList(VoucherTableHeadVO voucherTableHeadVO) {
List<String> headTitle0 = new ArrayList<String>();
List<String> headTitle1 = new ArrayList<String>();
List<String> headTitle2 = new ArrayList<String>();
List<String> headTitle3 = new ArrayList<String>();
List<String> headTitle4 = new ArrayList<String>();
List<String> headTitle5 = new ArrayList<String>();
headTitle0.add("时间");
headTitle1.add("客户");
headTitle2.add("合同名称");
headTitle3.add("产品名称");
headTitle4.add("总吨数");
headTitle5.add("数据类型");
//这个list是查询出的该产品所关联的属性
List<VoucherTableHeadVO> list = voucherQualityMapper.getTableHead(voucherTableHeadVO);
List<List<String>> qualiyuNameAll = new ArrayList<List<String>>();
qualiyuNameAll.add(headTitle0);
qualiyuNameAll.add(headTitle1);
qualiyuNameAll.add(headTitle2);
qualiyuNameAll.add(headTitle3);
qualiyuNameAll.add(headTitle4);
qualiyuNameAll.add(headTitle5);
for (int i=0;i<list.size();i++) {
List<String> qualityNames = new ArrayList<String>();
String qualityName = list.get(i).getQualityName();
qualityNames.add(qualityName);
qualiyuNameAll.add(qualityNames);
}
return qualiyuNameAll;
}
表数据
@Override
public List<List<Object>> setWeekList(VoucherTableHeadVO voucherTableHeadVO) {
List<List<Object>> lists = new ArrayList<List<Object>>();
int count = 0;
for(int i=0;i<4;i++){
List<Object> list = new ArrayList<>();
VoucherTableHeadVO vo = voucherQualityMapper.getWeekTableContent(voucherTableHeadVO);
if (count == 0) {
list.add(voucherTableHeadVO.getBookStartTime()+"至"+voucherTableHeadVO.getBookEndTime());
list.add(vo.getCustName());
list.add(vo.getContractName());
list.add(vo.getProdName());
list.add(vo.getNetWeight());
list.add("化验次数");
List<VoucherTableHeadVO> timeList = voucherQualityMapper.getTestTime(voucherTableHeadVO);
for(int j=0;j<timeList.size();j++){
Integer time = timeList.get(j).getTime();
list.add(time);
}
} else if (count == 1) {
list.add("");
list.add("");
list.add("");
list.add("");
list.add("");
list.add("指标要求");
List<VoucherTableHeadVO> passRateList = getPassRate(voucherTableHeadVO);
for(int j=0;j<passRateList.size();j++){
String label = passRateList.get(j).getLabel();
Double standard = passRateList.get(j).getStandard();
list.add(label+standard);
}
} else if (count == 2) {
list.add("");
list.add("");
list.add("");
list.add("");
list.add("");
list.add("加权平均");
List<VoucherTableHeadVO> weightedMeanlist = getWeightedMean(voucherTableHeadVO);
for(int j=0;j<weightedMeanlist.size();j++){
BigDecimal weightedMean = weightedMeanlist.get(j).getWeightedMean();
list.add(weightedMean);
}
} else if (count == 3) {
list.add("");
list.add("");
list.add("");
list.add("");
list.add("");
list.add("合格率");
List<VoucherTableHeadVO> passRateList = getPassRate(voucherTableHeadVO);
for(int j=0;j<passRateList.size();j++){
Double PassRate = passRateList.get(j).getPassRate();
list.add(PassRate+"%");
}
}
lists.add(list);
count++;
if(count >3){
count = 0;
}
}
return lists;
}