easyExcel 用 head 实现动态表头

转自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);
		}
 
	}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值