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);
    }


}
相关推荐
该用户已不存在6 分钟前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
TT哇37 分钟前
@[TOC](计算机是如何⼯作的) JavaEE==网站开发
java·redis·java-ee
Tina学编程43 分钟前
48Days-Day19 | ISBN号,kotori和迷宫,矩阵最长递增路径
java·算法
青川入梦1 小时前
MyBatis极速通关上篇:Spring Boot环境搭建+用户管理实战
java·开发语言·mybatis
执子手 吹散苍茫茫烟波1 小时前
leetcode415. 字符串相加
java·leetcode·字符串
小韩博1 小时前
网络安全(Java语言)脚本 汇总(二)
java·安全·web安全
萤丰信息1 小时前
技术赋能安全:智慧工地构建城市建设新防线
java·大数据·开发语言·人工智能·智慧城市·智慧工地
带刺的坐椅2 小时前
Java MCP 的鉴权?好简单的啦
java·鉴权·mcp·solon-ai
Pocker_Spades_A2 小时前
飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
java·开发语言
33255_40857_280592 小时前
掌握分页艺术:MyBatis与MyBatis-Plus实战指南(10年Java亲授)
java·mybatis