easyexcel指定sheet页动态给行列加背景色

需求

1、easyexcel,有多个sheet页,某些sheet页的行、列动态需要加背景色。

2、扩展支持cellStyle标记单元格超过64000

复制代码
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import java.util.HashMap;
import java.util.List;
复制代码
@Slf4j
public class ExcelBackgroudHandler implements CellWriteHandler {
复制代码
//颜色
private Short colorIndex;

//行,以及对应的列,多个列逗号拼接
private HashMap<Integer,String> rowColMap;

//保存单元格样式,否则cellStyle被创建超过64000就会报错
Map<String,CellStyle> cellStyleMap = new HashMap<>();
复制代码
    public ExcelBackgroudHandler(Short colorIndex, HashMap<Integer, String> rowColMap) {
        this.colorIndex = colorIndex;
        this.rowColMap = rowColMap;
    }


    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                Head head, Integer relativeRowIndex, Boolean isHead) {
    }

    @Override
    public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                       CellData cellData, Cell cell, Head head, Integer relativeRowIndex,
                                       Boolean isHead) {

    }

    /***
     * 指定行列加颜色
     * @param writeSheetHolder
     * @param writeTableHolder
     * @param cellDataList
     * @param cell
     * @param head
     * @param relativeRowIndex
     * @param isHead

     * @Date: 2023/11/22 17:02
    **/
    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                 List<CellData> cellDataList, Cell cell, Head head,
                                 Integer relativeRowIndex, Boolean isHead) {
        int columIndex = cell.getColumnIndex();
        int rowIndex = cell.getRowIndex();
        if (null != rowColMap && rowColMap.get(rowIndex)!=null && rowColMap.get(rowIndex).contains(columIndex+"")) {
            Sheet sheet = writeSheetHolder.getSheet();
            Workbook workbook = sheet.getWorkbook();
            CellStyle cellStyle;
            String key = colorIndex+"";
            if(cellStyleMap.get(key )!=null){
                cellStyle = cellStyleMap.get(key );
            }else{
                cellStyle = workbook.createCellStyle();
                cellStyle.setFillForegroundColor(colorIndex);
                // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND
                cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                cellStyleMap.put(key ,cellStyle);
            }
            cell.setCellStyle(cellStyle );
        }
    }



}
复制代码
@Data
public class TestVO {


    @ExcelProperty(value = "姓名", index = 0)
    private String name;


    @ExcelProperty(value = "年龄", index = 1)
    private int age;

    @ExcelProperty(value = "学校", index = 2)
    private String school;


}

测试类

复制代码
/**
 * 测试导出模板
 * 1. 标题指定某列标红色字段
 * 2. 标题指定某列加批注
 */
public static void main(String[] args) throws FileNotFoundException {
    String filePahth = "D:\\1.xlsx";
    // 输出流
    OutputStream outputStream = new FileOutputStream(new File(filePahth));
    // 导出的数据
    List<TestVO> dataList = new ArrayList<>();
    for(int i=0;i<35000;i++){
        TestVO testVO = new TestVO();
        testVO.setAge(11);
        testVO.setName("测试dd"+i);
        testVO.setSchool("学校"+i);
        TestVO testVO1 = new TestVO();
        testVO1.setAge(111);
        testVO1.setName("测试1"+i);
        testVO1.setSchool("学校1"+i);
        dataList.add(testVO);
        dataList.add(testVO1);
    }

    // 指定批注
    HashMap<Integer, String> annotationsMap = new HashMap<>();
    for(int i=0;i<70000;i++){
        annotationsMap.put(i,"1,2");
    }
    ExcelBackgroudHandler excelBackgroudHandler = new ExcelBackgroudHandler(IndexedColors.RED.index,annotationsMap);
    WriteSheet writeSheet = EasyExcel.writerSheet(1, "测试")
            .registerWriteHandler(excelBackgroudHandler).head(TestVO.class).build();
    WriteSheet writeSheet2 = EasyExcel.writerSheet(2, "测试2")
            .registerWriteHandler(excelBackgroudHandler).head(TestVO.class).build();
    ExcelWriter excelWriter = EasyExcel.write(outputStream).build();
    excelWriter.write(dataList,writeSheet);
    excelWriter.write(dataList,writeSheet2);
    excelWriter.finish();

    //excel追加导出
    String newFilePath = "D:\\1temp.xlsx";
    ExcelWriter excelWriter1 = EasyExcel.write(newFilePath).withTemplate(filePahth).build();
    WriteSheet writeSheet1 = EasyExcel.writerSheet(2, "测试1") .head(TestVO.class).build();
    excelWriter1.write(dataList,writeSheet1);
    excelWriter1.finish();
    File tempFile = new File(newFilePath);
    if (tempFile.exists()) {
        File file = new File(filePahth);
        file.delete();
        tempFile.renameTo(file);
    }


}
相关推荐
金銀銅鐵2 小时前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(上)
java·后端·ai编程
福建佰胜张工2 小时前
SMC 薄型气爪 MHF2-16D1 深度解析:平行开闭、低剖面结构在自动化装配中的选型与落地
java·服务器·安全·自动化
catoop2 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
system_error_x3 小时前
SpringBoot 集成 Thymeleaf 简洁入门
java·spring boot·后端
驭渊的小故事3 小时前
Spring AI Alibaba 实战:从maven依赖治理到声明式工具调用
java·人工智能·spring
Elastic 中国社区官方博客4 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1884 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn4 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
y1su5 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
我命由我123456 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法