转自https://blog.csdn.net/qq_38962655/article/details/126946653
作者:AmbitionLover
表头
java 的easyExcel 的 head 的结构
List<List<String>> heads
外层的list 控制按列展开的表头、内层list放按行展开的表头
白话文就是:
// 以下总共4列
// 内层list 有两个值,表示有两行,外层list有两个对象,表示有两列。同一行如果列名相同,将进行合并
heads.add(Arrays.asList(“基本信息”,“姓名”));
heads.add(Arrays.asList(“基本信息”,“联系方式”));
// 同上
heads.add(Arrays.asList(“额外信息”,“收入”));
heads.add(Arrays.asList(“额外信息”,“兴趣爱好”));
填充数据
java 的easyExcel 的 head 的结构 :
List<List<String>> dataList
和head同理,外层list 对应行,内层list对应列。依次填充数据就好.
下面是我实际写的一个测试样例。供参考
public void exportSpUser(SpUserExportRequest request, HttpServletResponse response) {
List<SpUserExportDto> spUserExportDtos = spUserService.selectSpUseExportByIds(request);
// 采用动态 表头设计
List<List<String>> heads = new ArrayList<>(3);
// 1、常用信息
List<String> names = Arrays.stream(SpUserExportDto.class.getDeclaredFields())
.filter(field -> field.isAnnotationPresent(ExcelProperty.class))
.map(field -> {
ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
return annotation.value()[annotation.value().length - 1];
})
.collect(Collectors.toList());
for (String name : names) {
heads.add(Arrays.asList("基本信息",name));
}
// 2、指标信息
Map<String, String> userParamsValue2Name = getUserParamsValue2Name();
for (String name : userParamsValue2Name.values()) {
heads.add(Arrays.asList("指标信息",name));
}
// 数据需要重新计算
List<List<String>> dataList = new ArrayList<>(spUserExportDtos.size());
for (SpUserExportDto spUserExportDto : spUserExportDtos) {
Field[] declaredFields = spUserExportDto.getClass().getDeclaredFields();
List<String> datas = new ArrayList<>();
for (Field declaredField : declaredFields) {
// userParams 特殊处理
if (!declaredField.isAnnotationPresent(ExcelProperty.class) && !declaredField.getName().equals("userParams")){
continue;
}
boolean accessible = declaredField.isAccessible();
declaredField.setAccessible(true);
try {
// 数据 需要头对应上,所有空的时候赋值 空字符串
Object o = declaredField.get(spUserExportDto);
if (o == null) {
datas.add("");
continue;
}
if (Map.class.isAssignableFrom(o.getClass())) {
Map<String, String> map = (Map<String, String>) o;
for (String paramsName : userParamsValue2Name.keySet()) {
datas.add(map.getOrDefault(paramsName, ""));
}
continue;
}
datas.add(String.valueOf(o));
} catch (IllegalAccessException e) {
throw new ServiceException("志愿者信息导出失败", e);
}
declaredField.setAccessible(accessible);
}
dataList.add(datas);
}
ExcelUtil<SpUserExportDto> excelUtil = new ExcelUtil<>(SpUserExportDto.class);
try {
ExcelWriterBuilder write = EasyExcelFactory.write(response.getOutputStream());
write.registerWriteHandler(new SpUserInfoSheetWriteHandler());
write.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy());
write.head(heads);
excelUtil.exportEasyExcelFromBuilder(response,write, dataList, "志愿者信息");
} catch (IOException e) {
throw new ServiceException("志愿者信息导出失败", e);
}
}