EasyExcel导出中单元格合并遇到问题

本文探讨了在使用EasyExcel模板导出和POI手工导出Excel时遇到的单元格合并问题。在EasyExcel模板导出中,通过合并策略类实现单元格合并,但第一行无法合并,需要设置新行。而在手工导出中,使用groupby进行分类合并时,由于默认使用HashMap导致数据顺序变化,需改为使用TreeMap保证顺序。
摘要由CSDN通过智能技术生成

在项目中需要对各种报表进行excel导出,主要使用了两种方式:esayExcel模板导出,poi手工导出。

esayExcel模板导出

使用模板导出相对而已比较简单,其过程如下:

  1. 准备excel模板
    在这里插入图片描述
    按照需求设计展示样式,同时填入对应的字段名称。字段的名称和填充的数据相关。

如果是填充的集合,则需通过“对象名.属性”的方式进行模板设计。

  1. 通过模板得到ExcelWriter
    public static ExcelWriter getExcelWriterWithMergeStrategy(HttpServletResponse response, String fileName, String templateFileName,
                                                              ExcelFillCellMergeStrategy excelFillCellMergeStrategy,
                                                              ExcelFillCellMergeStrategy detailMergeStrategy) throws Exception {
        OutputStream outputStream = response.getOutputStream();
        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName,"UTF-8"));
        response.setContentType("application/vnd.ms-excel;charset=UTF-8");//设置类型
        response.setHeader("Pragma", "No-cache");//设置头
        response.setHeader("Cache-Control", "no-cache");//设置头
        response.setDateHeader("Expires", 0);//设置日期头
        ExcelWriter excelWriter = EasyExcel.write(outputStream)
                .registerWriteHandler(excelFillCellMergeStrategy)
                .registerWriteHandler(detailMergeStrategy)
                .withTemplate(EasyExcelUtil.class.getClassLoader().getResourceAsStream("template/excel/"+templateFileName))
                .build();
        return excelWriter;
    }

主要是通过模板文件得到一个ExcelWriter 对象,其中xxxMergeStrategy为合并策略类。

  1. 构建WriteSheet 并填充数据
WriteSheet writeSheet = EasyExcel.writerSheet("总体资源使用情况").build();
writeSheet.setAutoTrim(true);
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 不加这个配置,第一行无法合并
//填充普通变量
excelWriter.fill(data, writeSheet);

excelWriter.fill(new FillWrapper("resourceScale", resourceScaleStatisticsVoList), fillConfig, writeSheet);
  • 模板填充整个过程比较简单,主要是考虑单元格合并问题。单元格合并需要传入一个合并策略类,主要的逻辑是在数据填充过程中,会比较当前行和前一行的数据是否相同,如果相同则合并。
public class ExcelFillCellMergeStrategy implements CellWriteHandler {
   
    private String sheet;

    private List<MergeStrategyParam> mergeStrategyParams;

    public ExcelFillCellMergeStrategy(List<MergeStrategyParam> mergeStrategyParams, String sheet) {
   
        this.sheet = sheet;
        this.mergeStrategyParams = mergeStrategyParams;
    }

    public static ExcelFillCellMergeStrategy createMergeStrategy(int[] mergeColumnIndex, int mergeRowIndexStart, int mergeRowIndexEnd, String sheet){
   
        ExcelFillCellMergeStrategy.MergeStrategyParam mergeStrategyParam = new ExcelFillCellMergeStrategy.MergeStrategyParam();
        mergeStrategyParam.setMergeColumnIndex(mergeColumnIndex);
        mergeStrategyParam.setMergeRowIndexStart(mergeRowIndexStart);
        mergeStrategyParam.setMergeRowIndexEnd(mergeRowIndexEnd
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值