在工作中遇到这样一个需求,需要将Excel进行列分组与行分组,如下图所示
点击按钮之后,可以进行分组展示
那么我们需要如何进行分组操作呢?
EasyExcel中并没有相对应的分组操作,但是EasyExcel是基于POI进行开发的,EasyExcel中支持POI
因此我们可以通过EasyExcel配合POI来进行分组
EasyExcel中可以设置各种Handler,如CellWriteHandler(单元格),SheetWriteHandler(Sheet页)
我们可以自定义一个Handler,来进行分组操作
Handler中定义了如下的方法,我们拿CellWriteHanlder举例
我们采用最后一个 afterCellDispose(在单元格处置之后)
那么让我们开始自定义一个我们自己的CellWriteHandler
package com.sgm.cadillac.mobile.easyexcel.handler;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import java.awt.*;
@Slf4j
public class MyCellWriteHandler implements CellWriteHandler {
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
}
}
每当EasyExcel输出一个单元格之后都会到这个Handler里面执行你的代码,因此你可以在这里进行分组(不能采用SheetWriteHandler来进行行分组 Sheet比Cell先创建)
现在我们就可以进行分组了
WriteSheetHolder writeSheetHolder = context.getWriteSheetHolder();
Sheet sheet = writeSheetHolder.getSheet();
//进行列分组
sheet.groupColumn(x, x);
//进行行分组
sheet.groupRow(x, x);
以上只是简单的写死了分组,一般我们需要用逻辑分组,那么我们可以自定义这个CellWriteHandler的构造函数,传入我们进行逻辑计算分组的数据,这样我们就可以进行分组了
注意:POI分组默认只能分一百条数据,如果我们数据操作一百条,那么他就会只进行最后一百条的分组。
通过研究发现,我们可以开启EasyExcel的这个参数来解除限制,官方API文档显示如下:
我们需要设置这个参数为Ture,否则分组只能分一百条
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).inMemory(true).build()