springboot+easyexcel实现固定表头+动态表头的数据导出

/**
 * 固定标头的实体类
 */
@Data
public class BaseExportExcelStringVo implements Serializable {
    private static final long serialVersionUID = 1L;

    @ExcelProperty( value = "日期时间",index = 0)
    @ApiModelProperty("日期时间")
    @ColumnWidth(20)
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private String time;

    @ColumnWidth(40)
    @ExcelProperty( value = "数据",index = 1)
    @ApiModelProperty("数据")
    private String data;
}
/**
 * 数据结果实体类
 */
@Data
public class DeviceExportExcelVo implements Serializable {
    private static final long serialVersionUID = 1L;
	
	@ExcelProperty( value = "日期时间",index = 0)
    @ApiModelProperty("日期时间")
    @ColumnWidth(20)
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private String time;

    @ColumnWidth(20)
    @ExcelProperty( value = "评分",index = 9)
    @ApiModelProperty("评分")
    private BigDecimal score;

    @ApiModelProperty("单体电压")
    private BigDecimal cellVolt;

    @ApiModelProperty("单体温度")
    private BigDecimal cellTemp;
}

private void exportDetailExcelInOneSheet(HttpServletResponse response) throws Exception {
	//固定列
	List<DeviceExportExcelVo> voList = new ArrayList<>();
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	//单体电压 动态列 1
	List<BaseExportExcelStringVo> voltVoList = new ArrayList<>();
	//单体温度 动态列 2
	List<BaseExportExcelStringVo> tempVoList = new ArrayList<>();
	
	List<List<String>> commonList = new ArrayList<>();
	List<List<String>> voltHeadList = new ArrayList<>();
	List<List<String>> tempHeadList = new ArrayList<>();
	List<List<String>> headList = new ArrayList<>();
	List<List<Object>> sheetDataList = new ArrayList<>();
	// 临时列 用于存放固定列和动态列的数据
	List<BaseExportExcelStringVo> sheetVoList = new ArrayList<>();
	
	//************中间固定值列不再描述先用666代替*****
	for (DeviceExportExcelVo vo : dataList) {			
		String timeStr = vo.getTime();
		vo.setScore(666);
		//单体电压
		BaseExportExcelStringVo baseVoltExportExcelStringVo = new BaseExportExcelStringVo();
		baseVoltExportExcelStringVo.setTime(timeStr);
		baseVoltExportExcelStringVo.setData(vo.getVoltageList().toString());
		voltVoList.add(baseVoltExportExcelStringVo);
		//单体温度
		BaseExportExcelStringVo baseTempExportExcelStringVo = new BaseExportExcelStringVo();
		baseTempExportExcelStringVo.setTime(timeStr);
		baseTempExportExcelStringVo.setData(vo.getTempList().toString());
		tempVoList.add(baseTempExportExcelStringVo);
		voList.add(vo);
		//所有数据放到一行,然后动态导出excel
		BaseExportExcelStringVo sheetVo = new BaseExportExcelStringVo();
		sheetVo.setTime(timeStr);
		//主要的想法就是把固定列和动态列放到一个列表中,这样就可以导出一个动态列就可以了
		sheetVo.setData(timeStr.concat(",")
				.concat(String.valueOf(vo.getScore())).concat(",")
						.concat(vo.getVoltageList().toString()).concat(",")
						.concat(vo.getTempList().toString())
		);
		sheetVoList.add(sheetVo);


		if (voltVoList.size() > 0) {
			voltHeadList = getHeadList(voltVoList, "单体电压");
		}
		if (tempVoList.size() > 0) {
			tempHeadList = getHeadList(tempVoList, "单体温度");
		}
		sheetDataList = getDataList(sheetVoList);
		}
		
		String fileFinalPath = pyPath + File.separator + param.getSn() + ".xlsx";
		File file = new File(fileFinalPath);

		addCommonHead(commonList, "时间,评分");
		headList.addAll(commonList);
		headList.addAll(voltHeadList);
		headList.addAll(tempHeadList);
		EasyExcel.write(fileFinalPath).head(headList).sheet(0, "数据").doWrite(sheetDataList);
		//导出流
		export2File(file, response);
	}
	
}

/**
 * 填充固定表头
 *
 * @param commonList 表头
 * @param title      名称
 */
private void addCommonHead(List<List<String>> commonList, String title) {
	if (StringUtils.isNotBlank(title)) {
		List<String> titleList = Arrays.asList(title.split(","));
		if (titleList.size() > 0) {
			titleList.forEach(o -> {
				List<String> list = new ArrayList<>();
				list.add(o);
				commonList.add(list);
			});
		}
	}
}

/**
 * 动态头
 *
 * @return java.util.List<java.util.List < java.lang.String>>
 */
public List<List<String>> getHeadList(List<BaseExportExcelStringVo> dataVoList, String prefix) {
	List<List<String>> head = new ArrayList<>();
	int len = dataVoList.size();
	if (len > 0) {
		String[] split = dataVoList.get(0).getData().replaceAll("[\\[|\\]]", " ").split(",");
		List<String> titleList = Arrays.asList(split);
		for (int i = 0; i < titleList.size(); i++) {
			List<String> list = new ArrayList<>();
			list.add(prefix + (i + 1));
			head.add(list);
		}
	}
	return head;
}

/**
 * 动态数据
 *
 * @return java.util.List<java.util.List < java.lang.String>>
 */
public List<List<Object>> getDataList(List<BaseExportExcelStringVo> dataVoList) {
	List<List<Object>> dataLists = new ArrayList<>();

	//建立行列表
	for (int i = 1; i <= dataVoList.size(); i++) {
		if (dataLists.size() < i) {
			List<Object> objectList = ListUtils.newArrayList();
			dataLists.add(objectList);
		}
	}
	for (int i = 0; i < dataLists.size(); i++) {
		for (int j = 0; j < dataVoList.size(); j++) {
			int finalI = i;
			if (finalI == j) {
				String[] splitData = dataVoList.get(j).getData().replaceAll("[\\[|\\]]", " ").split(",");
				List<String> list = Arrays.asList(splitData);
				list.forEach(o -> {
					dataLists.get(finalI).add(o);
				});
				break;
			}
		}
	}
	return dataLists;
}

效果图如下

x在这里插入图片描述

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
SpringBoot是一个非常流行的开发框架,它为开发者提供了快速、简单的方式来构建Java应用程序。而EasyExcel是一个基于Java的强大的Excel读写框架,能够帮助开发者快速、高效地处理Excel文件。将SpringBootEasyExcel结合起来,可以实现动态表头导出的功能。 首先,我们需要在SpringBoot项目中引入EasyExcel的依赖,这可以通过在pom.xml文件中添加相应的依赖来实现。接着,我们需要编写相应的Java代码来实现动态表头导出的功能。首先,我们需要定义一个实体类,用来表示要导出数据结构。然后,我们需要编写一个Controller来处理导出请求,并在其中调用EasyExcel的API来实现Excel文件的导出操作。 在实现动态表头导出的过程中,我们需要动态生成表头信息,这可以通过使用EasyExcel的注解来实现。我们可以根据导出数据的结构动态地生成表头信息,并将其与实际的数据一起写入Excel文件中。这样,就能够实现动态表头导出的功能了。 除了上述的步骤之外,我们还需要进行一些配置工作,例如配置Excel文件的格式、样式等。通过这些配置,我们可以实现导出的Excel文件符合我们的实际需求。 总的来说,SpringBoot整合EasyExcel进行动态表头导出,需要引入EasyExcel的依赖,编写相应的Java代码,处理导出请求,并进行相应的配置工作。通过这样的方式,我们就能够实现动态表头导出的功能,使得导出的Excel文件能够满足我们的实际需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值