想要自定义导出复杂表头的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;
}
表头级数越多,套的层级就越多。
导出结果示例
最后说一下截止写这篇文章的时候easypoi的版本为4.3.0
截止此版本为止,easypoi不支持跨级表头出现,例如下图
如果有需要这种复杂表头的情况,可以看看下列源码位置的方法有没有进行修改
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导出多级表头是怎么样的