想要自定义导出复杂表头的EXCEL表格(三级表头+),在使用easypoi的情况下只能使用Map导出格式

ExcelExportEntity entity = new ExcelExportEntity();

此对象为导出EXCEL表格表格头的构建对象,其中有个list属性,这个属性就是多级表头的实现基础

一下为导出多级表头的代码示例

exportList.add(new ExcelExportEntity("列名", "列对应的字段"));

示例代码

// exportList为表头总的集合,导出的EXCEL表格的表头完全是按照这个来生成的
List<ExcelExportEntity> exportList = new ArrayList<>();
    // 创建最底部的一级表头10个
    ExcelExportEntity A1 = new ExcelExportEntity("一级表头A1", "a1");
    ExcelExportEntity A2 = new ExcelExportEntity("一级表头A2", "a2");
    ExcelExportEntity B1 = new ExcelExportEntity("一级表头B1", "b1");
    ExcelExportEntity B2 = new ExcelExportEntity("一级表头B2", "b2");
    ExcelExportEntity B3 = new ExcelExportEntity("一级表头B3", "b3");
    ExcelExportEntity C1 = new ExcelExportEntity("一级表头C1", "c1");
    ExcelExportEntity C2 = new ExcelExportEntity("一级表头C2", "c2");
    ExcelExportEntity D1 = new ExcelExportEntity("一级表头D1", "d1");
    ExcelExportEntity D2 = new ExcelExportEntity("一级表头D2", "d2");
    ExcelExportEntity D3 = new ExcelExportEntity("一级表头D3", "d3");

    // 创建二级表头,并将二级表头对应的下级一级表头放入其中,以此类推...
    ExcelExportEntity A = new ExcelExportEntity("二级表头A", "a");
    A.setList(Arrays.asList(A1,A2));
    ExcelExportEntity B = new ExcelExportEntity("二级表头B", "b");
    B.setList(Arrays.asList(B1,B2,B3));
    ExcelExportEntity C = new ExcelExportEntity("二级表头C", "c");
    C.setList(Arrays.asList(C1,C2));
    ExcelExportEntity D = new ExcelExportEntity("二级表头D", "d");
    D.setList(Arrays.asList(D1,D2,D3));

    ExcelExportEntity AA = new ExcelExportEntity("三级表头AA", "aa");
    AA.setList(Arrays.asList(A,B,C));
    ExcelExportEntity AB = new ExcelExportEntity("三级表头BB", "bb");
    AB.setList(Arrays.asList(D));

    ExcelExportEntity XYZ = new ExcelExportEntity("四级表头", "xyz");
    XYZ.setList(Arrays.asList(AA,AB));

    // 最后表头设置完毕,将总和起来的四级表头放入
    exportList.add(XYZ);
// EXCEL导出参数
ExportParams params = new ExportParams("表格标题__布拉布拉布拉", "随便取个sheet名", ExcelType.XSSF);
// 导出的表格
Workbook sheets = ExcelExportUtil.exportBigExcel(params, exportList, "查询数据用的接口":service, "查询数据接口要用到的查询参数":queryParams);

以上是构建表头的代码,其中关于数据方面如下

在Server层需要继承接口 IExcelExportServer  ,这个接口是easypoi官方的导出数据的接口

public interface service extends IExcelExportServer {

}
@Override
    public List<Object> selectListForExcelExport(Object queryParams, int page) {
        List<Map<String, Object>> list = selectExcel(查询参数);
        List<Object> objList = new ArrayList<>(list.size());
        objList.addAll(list);
        return objList;
    }


queryParams就是之前传入方法的查询参数,page参数是easypoi自己的分页导出参数,查询时需要带上。


easypoi会根据设置的分页查询条数自己循环调用查询,直到查询结果为空,表示数据查询完毕

最麻烦的点来了

你需要将查询获得的参数,根据之前设置的表头的层级关系对应,利用Map集合

以上方的表头为例,其Map结构为

public List<Map<String, Object>> selectExcel(查询参数) {
        List<Object> date = baseMapper.selectExcel(查询参数);
        List<Map<String, Object>> list = new ArrayList<>();
        for (Object o : date) {
            Map<String, Object> a = new HashMap<>();
            Map<String, Object> b = new HashMap<>();
            Map<String, Object> c = new HashMap<>();
            Map<String, Object> d = new HashMap<>();
            a.put("a1", o.getA1data()); // 一级表头A1对应下的参数
            a.put("a2", o.getA2data()); // 一级表头A2对应下的参数
            b.put("b1", o.getB1data()); // 一级表头B1对应下的参数
            b.put("b2", o.getB2data()); // 一级表头B2对应下的参数
            b.put("b3", o.getB3data()); // 一级表头B3对应下的参数
            c.put("c1", o.getC1data()); // 一级表头C1对应下的参数
            c.put("c2", o.getC2data()); // 一级表头C2对应下的参数
            d.put("d1", o.getD1data()); // 一级表头D1对应下的参数
            d.put("d2", o.getD2data()); // 一级表头D2对应下的参数
            d.put("d3", o.getD3data()); // 一级表头D3对应下的参数
            //至此数据对应的一级表头装填完毕,接下来只需要将表头放入对应的上一级表头即可

            Map<String, Object> aa = new HashMap<>();
            Map<String, Object> bb = new HashMap<>();
            List<Map<String, Object>> aa_data = Arrays.asList(a, b, c);
            List<Map<String, Object>> bb_data = Arrays.asList(d);
            aa.put("aa", aa_data);
            bb.put("bb", bb_data);


            Map<String, Object> xyz = new HashMap<>();
            List<Map<String, Object>> xyz_data = Arrays.asList(aa, bb);
            xyz.put("xyz", xyz_data);
            list.add(xyz);
        }
        return list;
    }

表头级数越多,套的层级就越多。


导出结果示例

easyexcel复杂表头java easypoi复杂表头_easyexcel复杂表头java

        最后说一下截止写这篇文章的时候easypoi的版本为4.3.0

        截止此版本为止,easypoi不支持跨级表头出现,例如下图

easyexcel复杂表头java easypoi复杂表头_List_02

 如果有需要这种复杂表头的情况,可以看看下列源码位置的方法有没有进行修改

cn.afterturn.easypoi.excel.export.base.ExportCommonService.getRowNums(List<ExcelExportEntity> excelParams, boolean isDeep)

这里贴一下4.3.0版本这个地方的源码,方便以后大家进行对比

/**
     * 判断表头是只有一行还是多行
     */
    public int getRowNums(List<ExcelExportEntity> excelParams, boolean isDeep) {
        for (int i = 0; i < excelParams.size(); i++) {
            if (excelParams.get(i).getList() != null
                    && StringUtils.isNotBlank(excelParams.get(i).getName())) {
                return isDeep ? 1 + getRowNums(excelParams.get(i).getList(), isDeep) : 2;
            }
            if (StringUtils.isNotEmpty(excelParams.get(i).getGroupName())) {
                return 2;
            }
        }
        return 1;
    }

PS:这里可以看出easypoi官方一开始的设想就是导出仅支持两层,即一层表格标题,一层表头。后面推出的MAP导出、支持多级表头等应该是后续补上的,所以兼容较差。题主暂时还没用过阿里的easyexcel,所以还不知道easyexcel是怎么样运作的,不知道easyexcel导出多级表头是怎么样的