easyExcel 用 head 实现动态表头
easyExcel 用 head 使用动态表头
文章共757字 · 阅读需要大约3分钟
一键AI生成摘要,助你高效阅读
问答
·
点击这里查看官方文档https://easyexcel.opensource.alibaba.com/
表头
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("额外信息","兴趣爱好"));
故,上面给的效果是
基本信息 | 额外信息 | ||
---|---|---|---|
姓名 | 联系方式 | 收入 | 兴趣爱好 |
xxx | xxx | xxx | xxx |
填充数据
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);
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)