EasyExcel读取和写出合并单元格处理

一、合并单元格读取

1.1 DemoTemplateListener(监听类)

读取合并单元格信息,主要是重写方法extra()

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.CellExtra;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Getter
@Slf4j
public class DemoTemplateListener extends AnalysisEventListener<DemoExtraData> {

    private final List<DemoExtraData> demoExtraDataList = new ArrayList<>();
    private final AtomicInteger rowNum = new AtomicInteger(1);

    @Override
    public void invoke(DemoExtraData data, AnalysisContext context) {
        ingredientsExtraDataList.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 数据读取完毕,业务处理
    }

    @Override
    public void extra(CellExtra extra, AnalysisContext context) {
        if (extra.getType() == CellExtraTypeEnum.MERGE) { // 判断类型是否合并单元格
            int firstRowIndex = extra.getFirstRowIndex(); // 合并单元格首行下标
            int lastRowIndex = extra.getLastRowIndex(); // 合并单元格末行下标
            int firstColumnIndex = extra.getFirstColumnIndex(); // 合并单元格首列下标
            int lastColumnIndex = extra.getLastColumnIndex(); // 合并单元格末列下标

            /**
             * 读取到合并单元格信息后,可以列逻辑填充单元格数据
             */
        }
    }

}

1.2 测试

读取合并单元格信息要声明extraRead(CellExtraTypeEnum.MERGE)

    @Test
    public void test(){
        String sourceFile = "/data/表.xlsx";
        DemoTemplateListener listener = new DemoTemplateListener();
        EasyExcel.read(sourceFile, IngredientsExtraData.class, listener)
                .extraRead(CellExtraTypeEnum.MERGE) // 声明读取合并单元格
                .sheet().doRead();
        List<DemoTemplateListener> demoTemplateListeners = listener.getDemoExtraDataList();
        demoTemplateListeners.forEach(System.out::println);
    }

二、写出合并单元格

2.1 DemoMergeStrategy(合并策略)

合并单元格,主要是实现AbstractMergeStrategy.merge()方法,指定需要合并的单元格

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.merge.AbstractMergeStrategy;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;

import java.util.List;

@Data
public class DemoMergeStrategy extends AbstractMergeStrategy {

    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
        // 如何合并第一列,第二行到第三行的单元格
        CellRangeAddress newMergeRegion = new CellRangeAddress(
                1, // 起始行
                2,      // 结束行
                0,   // 起始列
                0    // 结束列
        );
        List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
        // 判断是否存在改合并规则,没有则添加
        if(!mergedRegions.contains(newMergeRegion)) sheet.addMergedRegion(newMergeRegion1);
    }
}

2.2 测试

    @Test
    public void test(){
        String outFile = "/data/表.xlsx";
        // 导出数据
        List<DemoExcelTemplate> demoExcelTemplates;
        EasyExcel
                .write(outFile, DemoExcelTemplate.class)
                .registerWriteHandler(new DemoMergeStrategy()) //合并单元格策略
                .sheet("模板")
                .doWrite(demoExcelTemplates);
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容