1. pom文件引入hutool
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.12</version>
</dependency>
2. 实现
/**
*
* @param exhibitCkVos 传入的list
* @param response 回传文件流时使用
* @return
* @throws IOException
*/
public Object createTzExcel1(List<ExhibitCkVo> exhibitCkVos, HttpServletResponse response) throws IOException {
ExcelWriter writer = ExcelUtil.getWriter();
// 创建excelwriter并空出一行(如果在设置表头存在合并的时候不会被数据顶掉)
writer.writeHeadRow(new LinkedList());
List<List<String>> rows = CollUtil.newArrayList();
List<String> rowTitle = CollUtil.newArrayList("", "", "名称", "特征", "数量", "单位", "", "", "", "", "");
//合并单元格后的标题行,使用默认标题样式,当merg当前单元格为空值时merge中的值才回被显示出来,否则会被替换掉
// 开始行,结束行,开始列,结束列,名称,是否为标题
writer.merge(0, 1, 0, 0, "序号", true);
writer.merge(0, 1, 1, 1, "任务名称", true);
writer.merge(0, 0, 2, 5, "物品详情", true);
writer.merge(0, 1, 6, 6, "任务类型", true);
writer.merge(0, 1, 7, 7, "措施类型", true);
writer.merge(0, 1, 8, 8, "采取措施时间", true);
writer.merge(0, 1, 9, 9, "物品存放位置", true);
writer.merge(0, 1, 10, 10, "主办单位", true);
writer.setOnlyAlias(true);
//写入标题
writer.writeHeadRow(rowTitle);
//定义启始行(第一个合并列)
AtomicInteger index = new AtomicInteger(2);
//定义启始行(第二个合并列)...以后的合并列也是一样
AtomicInteger index2 = new AtomicInteger(2);
//按照单位分组数据汇总处理
Map<String, List<ExhibitCkVo>> collect = exhibitCkVos
.stream()
.collect(Collectors.groupingBy(i -> i.getUnitName(), LinkedHashMap::new, Collectors.toList()));
collect.entrySet().stream().forEach(x -> {
List<ExhibitCkVo> value = x.getValue();
if (value.size() == 1) {
//只有 一条数据,换行
index.set(index.get() + 1);
index2.set(index2.get() + 1);
} else {
//合并行
writer.merge(index.get(), index.get() + value.size() - 1, 10, 10, "", false);
index.set(index.get() + value.size());
//按照案件名称分组数据汇总处理
LinkedHashMap<String, List<ExhibitCkVo>> collect1 = value.stream().collect(Collectors.groupingBy(i -> i.getAjmc(), LinkedHashMap::new, Collectors.toList()));
collect1.entrySet().stream().forEach(y -> {
List<ExhibitCkVo> value1 = y.getValue();
if (value1.size() == 1) {
index2.set(index2.get() + value1.size());
} else {
writer.merge(index2.get(), index2.get() + value1.size() - 1, 1, 1, value.get(0).getAjmc()+"\n"+value.get(0).getAjbh(), false);
index2.set(index2.get() + value1.size());
}
});
}
});
//保存数据
exhibitCkVos.stream().forEach(x -> {
List<String> rowA = CollUtil.newArrayList(
"",
x.getAjmc() + "\n" + x.getAjbh(),
x.getExhibitName(),
x.getWptz(),
x.getSl(),
x.getDw(),
x.getAjlx(),
x.getCslx(),
x.getRkTime(),
x.getCcwz(),
x.getUnitName()
);
rows.add(rowA);
}
);
//一次性写出内容,强制输出标题
writer.write(rows, true);
long lon = System.currentTimeMillis();
String id = lon + "";
Random random = new Random();
for( int i = 0; i < 4; i++ ) {
id = id + random.nextInt(10);
}
String filePath = docDir + id + ".xls";
File outFile = new File(filePath);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
OutputStream os = null;
try {
os = new FileOutputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
return JsonResult.error(203, e.getMessage());
}
writer.flush(os, true);
// 关闭writer,释放内存
writer.close();
//此处记得关闭输出Servlet流
IoUtil.close(os);
return JsonResult.success(docMain + id + ".xls");
}
最终表格样式