点击这里查看官方文档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("额外信息","兴趣爱好"));

故,上面给的效果是

基本信息额外信息
姓名联系方式收入兴趣爱好
xxxxxxxxxxxx

填充数据

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);
		}

	}

大佬的解读

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐